我试图了解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?
答案 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
值是在调用时确定的,当您从全局代码引用它时,它引用窗口对象。