首页新闻找找看学习计划

JS的函数调用问题

0
悬赏园豆:20 [已解决问题] 解决于 2016-09-13 10:35
var length = 10;
function fn()
{
console.log(this.length);
}
var obj = {
length : 5,
men:function(fn){
fn();
arguments[0]();
}
}
obj.men(fn,1);
如题,输出为10 和 2。哪位大神能够详细的讲一下原理,谢谢了。
问题补充:

有不少人说这个2是参数个数,我不是太明白。arguments[0]不是fn吗?arguments[0]()不就是fn()吗?不是应该再调用一遍fn吗?怎么就出来参数个数了?

刘冰0117的主页 刘冰0117 | 初学一级 | 园豆:102
提问于:2016-09-12 22:40
< >
分享
最佳答案
0

先说一个准则:谁调用方法,this就是谁。直接调用函数,this是window对象。

 

第一个10应该没啥问题吧。men中调用了fn函数。根据上面的准则,this是window,那么很明显length就是10了。

第二个arguments[0](); 稍微分解下来看,变成 arguments.xx() ,因为下标和直接属性是类似的,所以我暂时用xx代替。

此时,根据准则,this就 应该是arguments,它的长度就是我们提供的参数个数,所以答案就是2。

 

引申:如果修改为: var fn2 = arguments[0]; fn2();  此时答案会变成什么?

收获园豆:20
幻天芒 | 高人七级 |园豆:36522 | 2016-09-13 09:16

感谢回答。后面这个我还是没搞明白,arguments[0]不是fn吗?arguments[0]()不就是fn()吗?不是应该再调用一遍fn吗?

这个引申没看明白题。。。

刘冰0117 | 园豆:102 (初学一级) | 2016-09-13 10:14

@刘冰0117: 引申的那个结果,就和你思考的一样,因为fn是没有调用,所以套上准则,this是window对象。

 

arguments[0](); 这种方式,其实是arguments.0() 类似的效果,因为有调用者,所以这个this = arguments.

幻天芒 | 园豆:36522 (高人七级) | 2016-09-13 10:29

@幻天芒: 谢谢,这个变量是个参数length,我知道了,谢谢

刘冰0117 | 园豆:102 (初学一级) | 2016-09-13 10:34
其他回答(2)
0

第一个10为window.length的值

第一个2为obj.men(fn,1);参数的个数的意思

刘宏玺 | 园豆:14004 (专家六级) | 2016-09-13 08:52

为啥是参数个数

支持(0) 反对(0) 刘冰0117 | 园豆:102 (初学一级) | 2016-09-13 10:10
0

men只有一个参数么不是?怎么传了俩?

顾晓北 | 园豆:9530 (大侠五级) | 2016-09-13 08:59

JS里面可以实现这种方式,跟别的语言不一样

支持(0) 反对(0) 刘冰0117 | 园豆:102 (初学一级) | 2016-09-13 10:10
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册