【问题标题】:this keyword is window object within a constructor functionthis 关键字是构造函数中的窗口对象
【发布时间】:2011-12-20 09:23:56
【问题描述】:

好的,所以我以为我明白这一点(不是双关语),但显然不是。

var Constructor = function () {
    var internalFunction = function () {
        return this === window;
    };
    this.myMethod = function () {
        alert(internalFunction());
    };
};
var myObj = new Constructor();
myObj.myMethod();

这会提醒true。为什么内部函数不能将this 视为对象?相反,我必须在myMethod 中使用alert(internalFunction.call(this));

编辑:我正在寻找关于为什么以这种方式分配this 的解释,而不是var self = this; 等解决方法。抱歉,如果我没有说清楚。

【问题讨论】:

  • 这个问题的答案都没有使用that。我觉得被背叛了。
  • @missingno:我不喜欢that。它是非描述性的。也就是说,我自己的回答并没有更好的选择:)
  • +1 表示无意的双关语
  • 几年后回来...我倾向于使用小写版本的构造函数。 function Note() { var note = this; 我认为这是一个非常易于阅读的约定。

标签: javascript this


【解决方案1】:

这是一个范围问题,尝试类似:

var Constructor = function () {
    var $this = this;
    var internalFunction = function () {
        return $this === window;
    };
    this.myMethod = function () {
        alert(internalFunction());
    };
};
var myObj = new Constructor();
myObj.myMethod();

【讨论】:

    【解决方案2】:

    由于功能范围规则,this 在每个函数内重新分配...我会将您的对象的副本存储为self 并相应地使用它...

    var Constructor = function () {
    
        var self = this;
    
        var internalFunction = function () {
            return self === window;
        };
        this.myMethod = function () {
            alert(internalFunction());
        };
    };
    var myObj = new Constructor();
    myObj.myMethod();
    

    应该给你你期望的输出。

    旁注

    这是 javascript 创建的一个相当不稳定的做法,主要是因为如果您在使用 Constructor 时忘记了 new 关键字,您得到 this 指的是 window (上帝)对象,因此您将在没有警告的情况下将myMethod附加到窗口。

    【讨论】:

      【解决方案3】:

      this 在调用函数之前不会绑定,并且取决于函数的调用方式。您可以将其视为隐式传递给函数的额外参数。

      在这种情况下,问题在于您使用internalFunction() 调用internalFunctionthis 值可以通过将函数作为方法调用(如在foo.bar()foo["bar"]() 中)或通过call()apply() 显式设置this 来设置。你的调用没有这样做,所以this 恢复到全局对象。

      在这种情况下实现您想要的同时保持internalFunction 私有的最简单方法是在构造函数中存储对this 的引用:

      var Constructor = function() {
          var thisObj = this;
      
          var internalFunction = function () {
              return thisObj === window;
          };
      
          thisObj.myMethod = function () {
              alert(internalFunction());
          };
      }
      

      【讨论】:

      • 啊,这很有道理...this 是在调用时分配的,所以通过调用internalFunction() 我隐含调用window.internalFunction()。解释得很好。
      • @jondavidjohn:我不会对此进行讨论,我对原始代码进行了不必要的调整,因此我已将其还原。感谢您指出。
      【解决方案4】:

      在 JavaScript 中有五种调用函数的方法。 this 的值取决于您选择的:

      1. 全局函数调用(例如myFunction())。没有给出this 的明确值。 this 的值将是默认对象(浏览器中的window)。
      2. 方法调用(例如obj.myFunction())。 this 的值是调用该方法的对象(在本例中为 obj)。
      3. 使用call 方法(例如myFunction.call(obj))。 this 的值是明确提供的(在本例中为 obj)。
      4. 使用apply 方法(例如myFunction.apply(obj))。 this 的值是明确提供的(在本例中为 obj)。
      5. 构造函数(例如new MyFunction())。 this 的值是运行时提供的新创建的对象。

      这里对这五个中的每一个进行了更详细的解释:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-26
        • 2012-10-24
        相关资源
        最近更新 更多