![](/img/trans.png)
[英]Why call to Function.apply.bind(fn, null) calls `fn.apply`, and not `Function.apply`?
[英]Why the output is 2 during second fn function call?
我遇到了一个 Javascript 示例,但对this
内部函数的范围不太满意,或者相当困惑。 请参阅下面的示例:
var length = 10;
function fn() {
console.log(this.length);
}
var obj = {
length: 5,
method: function(fn) {
fn();
arguments[0]();
}
};
obj.method(fn, 1);
第一次记录10
,这是可以理解的,因为它是从全局范围调用的。 然而,第二次2
被记录,这让我很困惑。 我在寻找答案,这就是我得到的——
我们知道我们可以使用 arguments[] 数组访问 JavaScript 函数中任意数量的参数。
因此,arguments0 只不过是调用 fn()。 现在在 fn 内部,这个函数的作用域变成了 arguments 数组,记录 arguments[] 的长度将返回 2
有没有人对此有更好的答案?
你调用arguments[0]();
因此this
的值与arguments
相同。
参数是: fn, 1
其中有2个。
因此, arguments.length
为2
。
参数是一个类似数组的对象。 当您调用arguments[0]()
,返回 this.length 的函数位于类似数组的参数对象中。 在这种情况下,关键字this指的是参数对象。
arguments: [function fn() { return this.length; }, 1]
arguments[0](); // returns 2;
这是一个不同的例子来帮助说明我的观点:
const arr = [1, 2, function() { return this.length }];
console.log(arr[2]()); // 3
数组中的第三项是一个函数,调用时返回数组的长度。 这类似于编写 arr.length。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.