Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/433.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 关于全局对象和全局范围的混淆_Javascript_Object_Scope_This - Fatal编程技术网

Javascript 关于全局对象和全局范围的混淆

Javascript 关于全局对象和全局范围的混淆,javascript,object,scope,this,Javascript,Object,Scope,This,阅读Doug在第4章中关于函数的“Javascript:the goods parts”,我们将讨论“方法调用模式”和“函数调用模式”(第28页) 当函数存储为对象的属性时,我们称之为 方法。当调用一个方法时,它被绑定到该对象 这是清楚的。然后在同一页中: 当函数不是对象的属性时,就会调用它 作为函数: var sum=加(3,4);//总和是7 当函数是 通过此模式调用,它绑定到全局对象。这 这是语言设计中的一个错误 我的问题是: 1.-“该对象绑定到全局对象”表示该对象绑定到全局范围 2.

阅读Doug在第4章中关于函数的“Javascript:the goods parts”,我们将讨论“方法调用模式”和“函数调用模式”(第28页)

当函数存储为对象的属性时,我们称之为 方法。当调用一个方法时,它被绑定到该对象

这是清楚的。然后在同一页中:

当函数不是对象的属性时,就会调用它 作为函数:
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-更新的答案,也是这里的工作示例-