首页 新闻 赞助 找找看

请高手帮忙解释一段JS?

1
悬赏园豆:10 [已解决问题] 解决于 2012-09-24 11:01
var foo = {
    bar: function () {
        console.log(this);
    }
};

foo.bar(); //  foo object
(foo.bar)(); //  foo object

(foo.bar = foo.bar)(); // window
(false || foo.bar)(); // window
(foo.bar, foo.bar)(); // window

请高人帮忙解释一下,为什么最后三个输出的是 window?

另外foo.bar()与(foo.bar)()是否相同,如果有区别是什么区别?

草根程序猿的主页 草根程序猿 | 初学一级 | 园豆:129
提问于:2012-09-24 09:37
< >
分享
最佳答案
1

后三个括号里面都是表达式,中间产生了一个匿名的函数,调用的实际上是这个匿名的函数,所以这里的function context变成了global的了。

 

如果没有生成新的匿名表达式,这种写法应该是等价的。

收获园豆:10
Ethan轻叹 | 小虾三级 |园豆:996 | 2012-09-24 09:51

非常感谢,我对这种方式很陌生,能否再详细说说这个匿名函数是怎么产生的呢?或者给点相关的资料也行,感谢!

草根程序猿 | 园豆:129 (初学一级) | 2012-09-24 09:54

@草根程序猿: 你可以把他看成

(function(){dosomething();})();

我是在看一本叫:javascript secrets的书。

呵呵,里面经常用一些忍者啊武士啊之类的小日本的词汇,让我看着有点不太愿意推荐。不过书还是好书啦

Ethan轻叹 | 园豆:996 (小虾三级) | 2012-09-24 10:14

@Ethan轻叹: 

谢谢。也就是说当一对小括号中有运算符时,这对小括号在执行过程中会产生一个匿名函数,对吧。因为(foo.bar)();这里第一对括号中没有运算符,所以没有产生匿名函数,所以结果是foo,是这样理解的吗?

草根程序猿 | 园豆:129 (初学一级) | 2012-09-24 11:00
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册