不清楚输出来源
Unclear output origin
我明白为什么第一个输出是10,但我无法理解为什么第二个输出是2
var length = 10;
function fn() {
console.log(this.length);
}
var obj = {
length: 5,
method: function(fn) {
fn();
arguments[0]();
}
};
obj.method(fn, 1);
arguments
通常是每个函数内部的一个对象,它包含传递给每个特定函数的参数值。在你的情况下:
obj.method(fn, 1);
// ^ ^ arguments object will have those 2 values
所以当你arguments[0]()
你实际上再次调用fn
但是在这种情况下你从一个对象触发fn
(arguments
对象)这就是关键点。
因此,fn
中的 this
关键字是对 arguments
对象的引用,在本例中,它的长度值为 2,就像您传递给的参数一样您的 obj.method(fn, 1)
调用和第二次记录的值。
this 书的第 1 和 2 章对 this
的行为方式进行了更广泛的解释,可能会帮助您更多地了解您的案例.
此外,值得注意的是,一个对象没有 .length
属性,但是 arguments
对象是一个 array-like
对象(检查 link 关于 arguments
对象),确实如此。
我明白为什么第一个输出是10,但我无法理解为什么第二个输出是2
var length = 10;
function fn() {
console.log(this.length);
}
var obj = {
length: 5,
method: function(fn) {
fn();
arguments[0]();
}
};
obj.method(fn, 1);
arguments
通常是每个函数内部的一个对象,它包含传递给每个特定函数的参数值。在你的情况下:
obj.method(fn, 1);
// ^ ^ arguments object will have those 2 values
所以当你arguments[0]()
你实际上再次调用fn
但是在这种情况下你从一个对象触发fn
(arguments
对象)这就是关键点。
因此,fn
中的 this
关键字是对 arguments
对象的引用,在本例中,它的长度值为 2,就像您传递给的参数一样您的 obj.method(fn, 1)
调用和第二次记录的值。
this 书的第 1 和 2 章对 this
的行为方式进行了更广泛的解释,可能会帮助您更多地了解您的案例.
此外,值得注意的是,一个对象没有 .length
属性,但是 arguments
对象是一个 array-like
对象(检查 link 关于 arguments
对象),确实如此。