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

时间:2013-09-26 18:24:53

标签: javascript

我试图了解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?

2 个答案:

答案 0 :(得分:2)

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

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

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

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

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

然后你必须从你的函数体中删除这个限定符,以便添加传递的args。

答案 1 :(得分:0)

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

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

var num1 = 10, num2 = 20;

您将获得日志的预期值。

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

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