请教有一个 javascript 问题

2015-04-16 00:45:39 +08:00
 whatisnew

如代码代示,js对象内访问,用 thisobj 都可以,但是在 对象方法内在 callback 里用 this 就会报未定义,但是用 obj.remove 就可以,求大神给指点一下,如何写比较好比较正确。

define(function() {

    var obj = {

        add: function(id) {
            // 这里可以用 this
            this.edit(id, function() {
                // 这里报 this 未定义
                this.remove(id);
                // 如果用 obj.remove() 就可以
                obj.remove(id);
            });
            // 也可以用 obj.edit()
            // 哪种效率比较高呢?
            // 或者是比较标准的正确写法呢?
        },

        edit: function(id) {
            console.log('edit');
        },

        remove: function(id) {
            console.log('remove');
        }

    };

    return obj;
});
3809 次点击
所在节点    JavaScript
31 条回复
200cc
2015-04-16 09:09:17 +08:00
js可以用prototype来实现oop.
感觉这样理解起来更容易.
Hyperion
2015-04-16 09:11:09 +08:00
使用this 其实完全没有什么问题, 而且上面对this 的解释似乎有点小问题?

可以参考MDN 的这个链接, 似乎是有意漏掉了某个?
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this

Javascript 的this 不是难理解, 只是因为它本身的一组特性综合导致他和别的语言不一样. 关于在闭包里使用this , 我最早是从阮一峰的blog 上看到最完整的概述的.

效率问题, 都是引用. 作为一种习惯, 理解this 很重要, 因为这个已经是通行的做法了.

掏出犀牛书第六版(第五版没有在学校), p188页 译者注释.

仅作讨论, 求同存异. 希望不要引起争执.

书, 个人不提供建议, 自认水平有限. 犀牛这本圣经扫了几遍, 但看红皮还是有很多要补的地方, 比如逻辑操作符具体的特性, 各种实现类方式的利弊, 以及各种兼容实现问题.
whatisnew
2015-04-16 09:14:13 +08:00
@200cc prototype 实现的 oop 会有效率上的提升吗?因为我看到 prototype oop 在调用的时候太惨了 new(_) 那个下划线,那些个 find 真心觉得是乱码一样,比较难理解。
Hyperion
2015-04-16 09:24:54 +08:00
@whatisnew 可以去看Javascript 高级程序设计, 相关例子会比犀牛书更完整.
superbear
2015-04-16 09:45:28 +08:00
callback里的this没有这属性,this此时指向的是window。楼上很多大牛
neone
2015-04-16 10:16:54 +08:00
@sneezry JavaScript中函数没有签名,传入函数的参数可以通过局部变量arguments(类数组对象)访问到。
@whatisnew 可以看看《JavaScript高级程序设计 第三版》的7.2.2关于this对象这一节,里面的例子和你这个问题差不多。
200cc
2015-04-16 10:25:54 +08:00
@whatisnew
个人理解,oop的目的在于处理代码的复用性与可读性.效率的问题更依赖于或算法或运行环境来解决.

至于你提到的new(_)什么什么的, 应该是你看的那段代码编写的不规范, 和prototype没关系啊. 推荐你去读一下阮一峰的博客:Javascript 面向对象编程, 深入浅出, 不能再赞.
sneezry
2015-04-16 10:32:14 +08:00
@neone 受教😄
whatisnew
2015-04-16 10:38:19 +08:00
@200cc 找到了,不错不错!赞!
hussion
2015-04-16 10:44:05 +08:00
this.remove(); 非严格模式下,此处this指向的是window,严格模式下是null,所以,你懂得。。。
jarlyyn
2015-04-16 11:02:23 +08:00
var self=this;

this是js里比较蛋疼的一个坑。

主要和使用回调/对象有关系,其实你用用call,apply,需要你制定thisarg就能明白了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/184016

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX