var length = 10;
function fn() {
console.log(this.length);
}
var obj = {
length: 5,
method: function() {
fn();
arguments[0]();
}
};
obj.method(fn, 1);
结果:10 2 为神马??
var length = 10;
function fn() {
console.log(this.length);
}
var obj = {
length: 5,
method: function() {
fn();
arguments[0]();
}
};
obj.method(fn, 1);
结果:10 2 为神马??
楼主代码敲错了不少
mothod: function(fn2){
fn();
arguments[0]();
fn2();
}
输出 10 2 10
因为arguments是Javascript的一个内置对象,是一个类数组,也有this,这里的this就是arguments的this
第一个length是自定义变量length,第二个length是method方法内置对象arguments的长度,你传入了两个参数(fn,1),也就是数组arguments = [fn, 1];
10 回答11.3k 阅读
5 回答4.9k 阅读✓ 已解决
4 回答3.2k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
稍稍修改一下你的代码
arguments[0]()
中的this
是arguments
看起来
arguments
是一个数组,所以arguments[0]()
的执行似乎应该按函数数组的方式来运行,但实际不是,因为arguments
是一个伪数组不是真正的数组,所以argumnts[0]
其实是arguments["0"]
,"0"
是属性名称。现在假设属性名称是
"a"
,arguments["a"] = fn
,那么arguments["a"]()
和arguments.a()
是等同的,这时候fn
中的this
就是arguments
,这样很好理解吧?类似的,如果属性名是"0"
,虽然不能用arguments.0()
这种方式调用,但用arguments["0"]()
这种方式调用也是一样的,和arguments["a"]
类似,所以第二个输出是 2,即arguments.length
。