对此,全球对象和全球范围的困惑

时间:2011-11-17 20:05:35

标签: javascript object scope this

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

  

当函数存储为对象的属性时,我们将其称为a   方法。调用方法时,绑定到该对象。

很清楚。然后在同一页面中:

  

当函数不是对象的属性时,则调用它   作为一个功能:
  var sum = add(3,4); //总和是7
  当一个功能是   使用此模式调用,绑定到全局对象。这个   这是语言设计中的一个错误。

我的问题:

  • 1.-“这与全局对象绑定”意味着是否绑定到全局范围?
  • 2.-“这是语言设计中的一个错误”意味着这个应遵循与方法相同的规则吗?即,将这个绑定到自己身上?

感谢.-

编辑:所给出的答案都非常有启发性且记录良好。感谢所有参与者。

2 个答案:

答案 0 :(得分:1)

window是JavaScript中的全局对象。如果您定义这样的函数:

function myFunc() {
}

它将绑定到全局对象window,并且在函数内使用this将引用window对象。如果将函数定义为对象的属性,例如:

var obj = {
   myMethod: function() {
   }
};

使用this,它将引用该对象。

以下是一个示例:http://jsfiddle.net/williamvanr/qBXF8/

答案 1 :(得分:1)

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,那么就会在该警报中看到。