【问题标题】:Confusion about this, global object and global scope关于这个,全局对象和全局范围的混淆
【发布时间】:2011-12-31 16:37:37
【问题描述】:

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

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

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

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

我的问题:

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

谢谢。-

编辑:给出的两个答案都非常有启发性并且有据可查。感谢所有参与者。

【问题讨论】:

    标签: javascript object scope this


    【解决方案1】:

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

    function myFunc() {
    }
    

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

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

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

    这里是一个例子:http://jsfiddle.net/williamvanr/qBXF8/

    【讨论】:

    • AFAIK,函数的绑定不是基于它们的创建方式,而是基于它们的调用方式。对于myFunc.call(obj)var fn = obj.myMethod; fn()this 与您声称的不同,而是相反。
    • @delnan 我想你明白了。这就是 Doug 谈到 4 种不同的调用模式的原因,对吗?
    • delnan 的意思是,如果将obj.myMethod 分配给全局范围内定义的变量,则上下文将更改为window,这是真的。您还可以在函数上使用call 更改上下文:myFunc.call( obj ) 会将上下文更改为objhttp://jsfiddle.net/williamvanr/qBXF8/1/
    • @william-van-rensselaer 哇。 +1 是的,我正在阅读 call 方法,所有这些都很有意义。谢谢!
    【解决方案2】:

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

    【讨论】:

    • 这不是一个单独的问题,即this 不是词法范围吗?
    • @rosscj2533 我想有人可以告诉我“继续阅读”RTFM,对吧?哈哈。是的,我已经研究过这个例子,你的最后一句话让我更好地理解了,谢谢!
    • @NomikOS - 没问题,当我阅读这本书时,我在其中添加了那个警报来说明它,所以认为它也可以帮助你。 @delnan - 在这种情况下,这确实说明了这个问题。 this 不是词法范围的问题吗?
    • @rosscj2533 嗨,rosscj,您能否更新此答案中显示的 sn-p 以使其正常工作? http://jsfiddle.net/VkfnS/1/.
    • @NomikOS - 更新的答案,这里也是工作示例 - jsfiddle.net/yCH26/1
    猜你喜欢
    • 2015-08-07
    • 1970-01-01
    • 1970-01-01
    • 2017-04-26
    • 1970-01-01
    • 2020-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多