Javascript call() 方法未生成预期的输出



我试图了解call()方法的工作原理。我有以下代码片段,我在Firebug Javascript控制台中执行

法典:

var window = {num1: 10, num2: 20};
var o = {num1: 20, num2: 30};
var sum = function(num1, num2) {
    return this.num1 + this.num2;
};
console.log(sum.call(o)); // 50
console.log(sum.call(window)); // 30
console.log(sum.call(this)); // 30

输出:

50
NaN
NaN

我预计输出分别为 50 和 30。为什么当窗口/此对象作为执行上下文传递时,call() 会返回 NaN?

声明窗口变量将单步跳过当前作用域的窗口对象。 这可能会导致意外行为(在我的浏览器中,Firefox,我得到50,30,NaN)。 将第一行更改为:

window.num1 = 10; window.num2= 20;

这会将 num1 和 num2 分配给全局窗口属性(不是一个好主意)。

另一方面,调用将第一个参数作为上下文传递(this)。 函数声明中的参数是不必要的。 如果要使用 arg 传递数组,请使用 apply,例如:

var myArgs = [10, 20];
sum.apply(window, myArgs);

然后,您必须从函数体中删除 this 限定符,以便将传递的参数相加。

你在什么环境中做这些测试? window 是一个主机对象,在所有浏览器中充当全局对象。不能在全局上下文中使用变量覆盖它。

因此,当您调用 window 时,您正在调用没有附加 num1 或 num2 属性的全局对象。如果你这样做了

var num1 = 10, num2 = 20;

您将获得日志的预期值。

这是因为在全局范围内分配变量会将它们分配为窗口的属性。

它适用于第三种情况,因为this值是在调用时确定的,当您从全局代码引用此值时,它引用窗口对象。

最新更新