Javascript 关于全局对象和全局范围的混淆
阅读Doug在第4章中关于函数的“Javascript:the goods parts”,我们将讨论“方法调用模式”和“函数调用模式”(第28页) 当函数存储为对象的属性时,我们称之为 方法。当调用一个方法时,它被绑定到该对象 这是清楚的。然后在同一页中: 当函数不是对象的属性时,就会调用它 作为函数:Javascript 关于全局对象和全局范围的混淆,javascript,object,scope,this,Javascript,Object,Scope,This,阅读Doug在第4章中关于函数的“Javascript:the goods parts”,我们将讨论“方法调用模式”和“函数调用模式”(第28页) 当函数存储为对象的属性时,我们称之为 方法。当调用一个方法时,它被绑定到该对象 这是清楚的。然后在同一页中: 当函数不是对象的属性时,就会调用它 作为函数: var sum=加(3,4);//总和是7 当函数是 通过此模式调用,它绑定到全局对象。这 这是语言设计中的一个错误 我的问题是: 1.-“该对象绑定到全局对象”表示该对象绑定到全局范围 2.
var sum=加(3,4);//总和是7
当函数是 通过此模式调用,它绑定到全局对象。这 这是语言设计中的一个错误 我的问题是:
- 1.-“该对象绑定到全局对象”表示该对象绑定到全局范围
- 2.“这是语言设计中的一个错误”意味着应该遵循与方法相同的规则?把这个绑在他自己身上
编辑:给出的两个答案都很有启发性,并且有很好的文档记录。感谢所有参与者。
窗口是JavaScript中的全局对象。如果定义这样的函数:
function myFunc() {
}
它将绑定到全局对象窗口
,并在函数中使用此
将引用窗口
对象。如果将函数定义为对象的属性,例如:
var obj = {
myMethod: function() {
}
};
并使用此
,它将引用对象
下面是一个示例:1-是
2-如果你继续阅读,紧接着他描述了一个“语言设计中的错误”的例子
var myObject = {
value: 1
};
myObject.double = function() {
var that = this;
var helper = function() {
alert('in helper, this.value = ' + this.value + ' and that.value = ' + that.value);
that.value = that.value + that.value;
}
helper();
};
myObject.double();
alert('after doubling, myObject.value = ' + myObject.value);
此警报将显示在作为对象属性的函数中使用“this”将不起作用。如果全局对象(可能是窗口)有一个.value
,则该值将显示在该警报中。AFAIK,函数的绑定不是基于它们的创建方式,而是基于它们的调用方式。使用myFunc.call(obj)
和var fn=obj.myMethod;fn()
,这并不像你所说的那样,而是相反的。@delnan我想你明白了。这就是Doug谈论4种不同调用模式的原因,对吗?delnan说,如果您将obj.myMethod
分配给全局范围中定义的变量,上下文将更改为window
,这是正确的。您还可以使用函数上的call
更改上下文:myFunc.call(obj)
将上下文更改为obj
@威廉·范·伦斯勒哇+1是的,我正在阅读关于调用方法的文章,所有这些都很有意义。谢谢这不是一个单独的问题,即这个不是词汇范围吗?@rosscj2533我想有人可以告诉我“继续阅读”RTFM,对吗?哈哈,是的,我已经学习了这个例子,你的最后一句话让我更好地理解了,谢谢@NomikOS-没问题,当我阅读这本书时,我在书中添加了警告来说明它,所以我认为它也可以帮助你@delnan-在这种情况下,这确实说明了问题。这个
不是词汇范围的问题吗?@rosscj2533 Hi rosscj,你能更新这个答案中显示的代码片段以正常工作吗@NomikOS-更新的答案,也是这里的工作示例-