0

我试图了解 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。当 window/this 对象作为执行上下文传递时,为什么 call() 返回 NaN?

4

2 回答 2

2

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

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

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

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

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

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

于 2013-09-26T18:31:21.837 回答
0

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

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

var num1 = 10, num2 = 20;

您将获得日志的预期值。

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

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

于 2013-09-26T18:32:58.110 回答