这样函数调用,该如何解释?

自由小菜园 2012-03-22 06:58:11

var foo = {
bar: function () {
alert(this);
}
};

1、foo.bar();//foo
2、(foo.bar)();//foo
3、(foo.bar = foo.bar)(); // global
4、foo.bar = foo.bar; foo.bar();//foo
6、(false || foo.bar)(); // global

...全文
352 40 打赏 收藏 转发到动态 举报
写回复
用AI写文章
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
峭沙 2012-03-30
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 的回复:]

引用 32 楼 axiheyhey 的回复:

我的理解是,js中小括号()有一个用法是(复杂表达式),这时的作用是取括号内的复杂表达式的最终结果为返回结果。也就是是(foo.bar = foo.bar)(3);等价于var func = (foo.bar = foo.bar); func(3); 此时this正好为window,(false || foo.bar)(5);同理

那你解……
[/Quote]第二个是简单表达式,亲。。
licai1210 2012-03-27
  • 打赏
  • 举报
回复
昨天看了下资料,这几个问题是网上找的吧,关系到引用类型、组合操作符、GetValue()方法,也就是前面LS说的一样,网上有很详细的解释,你可以找找。不过估计你也看了解释的
JParser 2012-03-26
  • 打赏
  • 举报
回复
请教一下那些建议去理解闭包的朋友,请你们用你们的闭包来分析一下这几个题
自由小菜园 2012-03-26
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 licai1210 的回复:]

foo.bar=function(){
alert(this);
}();

foo.bar();
两个括号加的地方不同,导致了不同的结果,如果是这样,那答案就和执行方法的对象有关,那很容易理解了,本质上和(foo.bar=foo.bar)这个括号没关系,只和(foo.bar=foo.bar)()后面这个括号有关系了,也就是函数对象的调用者
[/Quote]
你这个理解怎么说呢……,有点偏
自由小菜园 2012-03-26
  • 打赏
  • 举报
回复
[Quote=引用 37 楼 licai1210 的回复:]

我继续说说我的看法,也一直在想这个问题,不知道这次偏不偏了。

那2和3说说吧

2中程序的支行可以说是从左往右的过程,所以此时一定有活动对象,也就是说this一定指向一个地方

但是3中处理了赋值操作,就相当于程序会从=号右边算起,这个时候的函数体是不是应该没有活动对象呢?如果没有的话this指向为underfine,但是实际上这个是没有什么意义的,那JS引擎就将这个this默认指……
[/Quote]
你这样的解释,也没从本质上来说明,什么叫“从左往右的过程,一定有活动对象,从又往左就没有活动对象了”,这样的说法你觉得合理吗?
licai1210 2012-03-26
  • 打赏
  • 举报
回复
我继续说说我的看法,也一直在想这个问题,不知道这次偏不偏了。

那2和3说说吧

2中程序的支行可以说是从左往右的过程,所以此时一定有活动对象,也就是说this一定指向一个地方

但是3中处理了赋值操作,就相当于程序会从=号右边算起,这个时候的函数体是不是应该没有活动对象呢?如果没有的话this指向为underfine,但是实际上这个是没有什么意义的,那JS引擎就将这个this默认指向window对象,这个是前规范的一个bug,现在5中好像已经修复了。

我也希望搞懂这个啊………………,不过这个解释现在不算偏吧,我觉得还合理
a597926661 2012-03-26
  • 打赏
  • 举报
回复
建议楼主学习一下闭包 这是JS进阶的必经之路 研究透了闭包 楼主的问题自然会迎刃而解
自由小菜园 2012-03-26
  • 打赏
  • 举报
回复
[Quote=引用 34 楼 sowuqing 的回复:]

我小小谈谈我的看法,表喷我啊,1,2,4都是调用的foo.bar方法,而3和6的括号里都是再判断真假,那么返回的应该不是foo对象吧,我觉得,所以3和6应该是一样的,括号里都返回的是true,而其他的都是foo的方法调用。不知道各位大侠,我说的对不对。
[/Quote]
你哪里看到3在判断真假了?
sowuqing 2012-03-26
  • 打赏
  • 举报
回复
[Quote=引用 34 楼 sowuqing 的回复:]

我小小谈谈我的看法,表喷我啊,1,2,4都是调用的foo.bar方法,而3和6的括号里都是再判断真假,那么返回的应该不是foo对象吧,我觉得,所以3和6应该是一样的,括号里都返回的是true,而其他的都是foo的方法调用。不知道各位大侠,我说的对不对。
[/Quote]
补充一下
(foo.bar)();应该相当于(function(){})();吧
而(false||foo.bar)相当于(true)();对吗?
sowuqing 2012-03-26
  • 打赏
  • 举报
回复
我小小谈谈我的看法,表喷我啊,1,2,4都是调用的foo.bar方法,而3和6的括号里都是再判断真假,那么返回的应该不是foo对象吧,我觉得,所以3和6应该是一样的,括号里都返回的是true,而其他的都是foo的方法调用。不知道各位大侠,我说的对不对。
自由小菜园 2012-03-26
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 axiheyhey 的回复:]

我的理解是,js中小括号()有一个用法是(复杂表达式),这时的作用是取括号内的复杂表达式的最终结果为返回结果。也就是是(foo.bar = foo.bar)(3);等价于var func = (foo.bar = foo.bar); func(3); 此时this正好为window,(false || foo.bar)(5);同理
[/Quote]
那你解释第二个
峭沙 2012-03-26
  • 打赏
  • 举报
回复
我的理解是,js中小括号()有一个用法是(复杂表达式),这时的作用是取括号内的复杂表达式的最终结果为返回结果。也就是是(foo.bar = foo.bar)(3);等价于var func = (foo.bar = foo.bar); func(3); 此时this正好为window,(false || foo.bar)(5);同理
likeajin 2012-03-26
  • 打赏
  • 举报
回复
除了第二个,其他都好解释,如果把第二个改成
(test=foo.bar)();这个和第三个类似,至于(foo.bar)()为什么是foo,暂时想不通~~,莫非第一个()这种情况下不起作用???
自由小菜园 2012-03-26
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 jparser 的回复:]

请教一下那些建议去理解闭包的朋友,请你们用你们的闭包来分析一下这几个题
[/Quote]
++
汉尼拔 2012-03-25
  • 打赏
  • 举报
回复
foo bar
licai1210 2012-03-25
  • 打赏
  • 举报
回复
foo.bar=function(){
alert(this);
}();

foo.bar();
两个括号加的地方不同,导致了不同的结果,如果是这样,那答案就和执行方法的对象有关,那很容易理解了,本质上和(foo.bar=foo.bar)这个括号没关系,只和(foo.bar=foo.bar)()后面这个括号有关系了,也就是函数对象的调用者
自由小菜园 2012-03-25
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 licai1210 的回复:]

var foo = {
bar: function () {
alert(this);
}
};
foo.bar=function(){
alert(this)
}();
foo.bar();
这样写是错误的
这个我还不想通为什么是错误的,估计和你那问题关系很大
var foo = {
bar: function () {
alert……
[/Quote]
这个错误不是很简单啊,你因为执行了方法,所以最后你foo.bar其实等于undefined
litter_man 2012-03-23
  • 打赏
  • 举报
回复
函数返回值赋值给了:foo.bar?
自由小菜园 2012-03-23
  • 打赏
  • 举报
回复
说错了,5楼,唉,眼花了
自由小菜园 2012-03-23
  • 打赏
  • 举报
回复
解释这个还是得从内部原理剖析,其实6楼说到了一些重点,关键还有一个getValue这个内部的调用
加载更多回复(19)

87,994

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧