【问题标题】:Is "this" necessary in javascript apart from variable definition除了变量定义之外,javascript中是否需要“this”
【发布时间】:2012-09-02 00:08:47
【问题描述】:

我的问题很简单。

我只是偶然发现,一旦你在对象中定义了一个带有this. 的属性,当你想调用它们时,你就不需要再在前面加上this.了。

所以this.真的是用来做广告定义时间的,比如var

不久之后我自己找到了它,我用这个来引用窗口对象。因为我在没有使用 new 的情况下调用了我的对象,所以它就像一个函数。

还有一个问题,可能是针对 cme​​ts 的。在主对象内部,如果我创建一个新对象,并在对象定义期间使用this,这个this 将指代什么?

【问题讨论】:

  • 简短的回答是“不”。但是,我对this 的了解还不够,无法给您完整的答案,所以我将把它留给其他人。准备好了解大量有用的新功能!
  • 你能举个例子吗?您所描述的内容不正确(除非这是窗口对象,即使那样您的描述也只是部分正确)。

标签: javascript this scope javascript-objects


【解决方案1】:

否,除非this 的上下文是一个全局 对象,例如window。举个例子:

function Foo(bar) {
    this.data = bar;
    console.log(this.data); // OK
    console.log(data); // ReferenceError
}

在此示例中,您将在第一个 console.log(data) 上获得一个 ReferenceError: data is not defined除非data 是一个全局变量。要访问实例的公共成员,您必须使用this.data

参考资料:

【讨论】:

  • 请注意,即使这是窗口,如果有一个局部变量覆盖全局变量,您可能仍需要说 this.someVariable。
【解决方案2】:

在各种情况下,您必须使用 this 才能引用正确的数据。

这两个实现做了非常不同的事情:

Array.prototype.truncate(newLen) {
    // sets the length property on the current Array object
    this.length = newLen;
}

Array.prototype.truncate(newLen) {
    // sets a global variable named length
    length = newLen;
}

var arr = [1,2,3,4,5,6,7];
arr.truncate(2);

如果要修改当前对象,您必须使用this 来控制发生的情况。您认为您可以将其关闭并且它仍会修改当前对象的属性的假设是不正确的。如果您不使用它,您正在修改全局变量,而不是成员属性。

【讨论】:

    【解决方案3】:

    所以这个。真的是用来做广告定义时间的,比如var?

    不,this 的重点是当前的执行范围。如果您不使用this,您可能(并且将会)遇到奇怪的错误。例如,假设您是一个具有属性val 的对象,然后在您拥有的该对象的原型上

    App.obj = function(){
       this.val = 'initial';
    }
    
    obj.prototype.myMethod = function(val) {
       // how would you assign argument val to object val?
    }
    

    还请注意,您的推理与方法有关。

    obj.prototype.meth2 = function(){
       myMethod();  // fails where this.myMethod() would work.
    }
    

    【讨论】:

      【解决方案4】:

      http://jsfiddle.net/BRsqH/:

      function f(){
          this.public='hello!';
          var hidden='TOP SECRET!';
      }
      var instance=new f();
      alert('Public data: '+instance.public+ /* gives "hello!" */
          '\nHidden data: '+instance.hidden /* gives undefined */
      );
      

      使用var 创建的变量是隐藏的,不能在创建它们的函数之外查看或修改。

      但是使用this 创建的变量是公开的,所以你可以在函数之外访问它们。

      【讨论】:

        【解决方案5】:

        我想我明白了。

        我将我的对象定义为function My_Object(){...},然后用MyObject() 调用它。这样 My_Object 被视为一个函数,而不是一个对象,因此 this == 窗口。

        所以最后我将属性和方法附加到窗口而不是 My_Object!这样就可以在不添加 .this 的情况下使用。

        将 My_Object 初始化为对象的正确方法是这样称呼它new My_Object,对吗?

        【讨论】:

        • 你现在似乎明白了。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-11
        • 1970-01-01
        • 2011-11-26
        • 1970-01-01
        • 1970-01-01
        • 2012-08-22
        相关资源
        最近更新 更多