0

我有几个关于 javascript 上使用“this”关键字的问题。


  1. 是不是不断的使用会this重载整个函数对象到RAM内存中?
  2. 最好申报

MyClass = function(){ 
    this.name = "Petter";
    this.age = 12;
    this.toString = function(){
        return "Name: "+this.name + " Age: " + this.age;  
    }
}

代替


MyClass = function(){
    var _this = this;
    _this.name = "Petter";
    _this.age = 12;
    _this.toString = function(){
        return "Name: "+_this.name + " Age: " + _this.age;  
    }
}

或者你有什么可以推荐给我的?

4

3 回答 3

2

不,这不是真的,我从来没有听说过这样的事情。

当你做的时候你所做的一切

var _this = this;

正在创建一个变量以指向您使用时引用的内存中的对象this。无论你说:

this.name = "Petter";

或者

_this.name = "Petter";

您仍在为同一个对象分配一个属性。您引用该对象(_thisthis)的方式没有区别。

编辑

this当您想在不同的范围内使用时,您经常需要获得参考this(setTimeout 就是一个很好的例子)。

    var MyClass = function() {
       setTimeout(function() { this.myMethod(); },100);
    };

    MyClass.prototype.myMethod = function() {
      console.log('hi there');
    }

    var myObject = new MyClass();

在上面的代码中,你会得到一个错误,因为当 setTimeout 函数被执行时,它是在全局范围内执行的,this === window并且你没有myMethod()window对象上调用函数。

要纠正这一点,您可以这样做:

    var MyClass = function() {
       var self = this;
       setTimeout(function() { self.myMethod(); },100);
    };

    MyClass.prototype.myMethod = function() {
      console.log('hi there');
    }

    var myObject = new MyClass();

即使您的 setTimeout 函数在全局范围内执行,变量self实际指向MyClass(or this) 的实例,因为您这样做了self = this(并且因为 JavaScript 是词法范围的 .

此外,这只是个人喜好,您会经常看到:

var self = this;

代替

var _this = this;

没什么大不了的,但这只是我认为值得一提的约定。

于 2013-10-18T15:22:25.310 回答
0
  1. 不,您可能会混淆这样一个事实,即如果您在new实例化对象时不使用关键字,则会复制与每个对象实例关联的原型函数。

  2. 正如亚当的回答中提到的,您只是通过添加另一个变量来使用更多内存。按照惯例,当它们是私有实例变量时,您通常会看到带有下划线前缀的变量名。

于 2013-10-18T15:42:21.613 回答
0

对于第一点,无论如何它都会在 RAM 中,我不能说为什么用它来引用它会改变任何东西。

至于第二点,最好将对象 this 引用存储在变量中,例如 self 或 _this 因为在 Javascript 中,当您调用函数时,函数的上下文可以通过 call 和 apply 函数来操作,这将改变什么这表示。

所以有了这个:

MyClass = function(){ 
    this.name = "Petter";
    this.age = 12;
    this.toString = function(){
        return "Name: "+this.name + " Age: " + this.age;  
    }
}
myObject = new MyClass();
myObject.call({name: 'bob', age: '15'});

myObject.call 行实际上会更改 toString 中对 this 的引用,因此它将返回“姓名:鲍勃年龄:15”而不是“姓名:彼得年龄:12”

于 2013-10-18T15:27:56.360 回答