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

Javascript call()方法未生成预期输出,javascript,Javascript,我试图理解call()方法是如何工作的。我在Firebug Javascript控制台中执行了以下代码片段 代码: 输出: 50 NaN NaN 我预计输出分别为50和30。当窗口/此对象作为执行上下文传递时,为什么call()返回NaN 声明窗口变量将跳过当前范围的窗口对象。这可能会导致意外行为(在我的浏览器firefox中,我得到50,30,NaN)。将第一行更改为: window.num1 = 10; window.num2= 20; 这将为全局窗口属性指定num1和num2(这不是一

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

代码:

输出:

50
NaN
NaN

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

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

window.num1 = 10; window.num2= 20;
这将为全局窗口属性指定num1和num2(这不是一个好主意)

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

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

然后,您必须从函数体中删除this限定符,以便它添加通过的参数。

您在什么环境中进行这些测试<代码>窗口是一个主机对象,在所有浏览器中充当全局对象。不能在全局上下文中使用变量覆盖它

因此,当您调用
窗口
时,您正在调用没有附加num1或num2属性的全局对象。如果是的话

var num1 = 10, num2 = 20;
您将获得日志的预期值

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


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

窗口
是浏览器中的保留字。您不能用变量覆盖或隐藏它。
引用的是全局命名空间,其中显然没有num1或num2成员。您可以使用局部变量对其进行阴影处理-
(function(){var window={};console.log(window)}()-但是当然你不能完全覆盖它,你仍然可以通过像
top.window
这样的操作在闭包中访问它。我误解了
window
的用法,并假设如果我覆盖
window
并向其添加变量,它将是全局范围的一部分。澄清有助于:)
var num1 = 10, num2 = 20;