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吗?怎么就出来参数个数了?
先说一个准则:谁调用方法,this就是谁。直接调用函数,this是window对象。
第一个10应该没啥问题吧。men中调用了fn函数。根据上面的准则,this是window,那么很明显length就是10了。
第二个arguments[0](); 稍微分解下来看,变成 arguments.xx() ,因为下标和直接属性是类似的,所以我暂时用xx代替。
此时,根据准则,this就 应该是arguments,它的长度就是我们提供的参数个数,所以答案就是2。
引申:如果修改为: var fn2 = arguments[0]; fn2(); 此时答案会变成什么?
感谢回答。后面这个我还是没搞明白,arguments[0]不是fn吗?arguments[0]()不就是fn()吗?不是应该再调用一遍fn吗?
这个引申没看明白题。。。
@刘冰0117: 引申的那个结果,就和你思考的一样,因为fn是没有调用,所以套上准则,this是window对象。
arguments[0](); 这种方式,其实是arguments.0() 类似的效果,因为有调用者,所以这个this = arguments.
@幻天芒: 谢谢,这个变量是个参数length,我知道了,谢谢
第一个10为window.length的值
第一个2为obj.men(fn,1);参数的个数的意思
为啥是参数个数
men只有一个参数么不是?怎么传了俩?
JS里面可以实现这种方式,跟别的语言不一样