2

我正在寻找 var self = 这个替代计划。

var Animal = function(name){
  this.name = name;
  this.arr = [1,2,3,4];
  this.inc = function(num){
      return num + 1;
  };

  this.fireArr = function(){
    var self = this;
    this.arr.forEach(function(item){
      console.log(self.inc(item));
    });

  };

};

var dog = new Animal("dog");
console.log(dog.fireArr());

我的小提琴在这里。

http://jsfiddle.net/haradashinya/TtYpc/

你有什么主意吗?

提前致谢。

4

3 回答 3

6

您可以将第二个参数设置为forEach,即this值。

this.arr.forEach(function(item){
  console.log(this.inc(item));
}, this);
于 2012-08-05T17:41:39.210 回答
5

您可以使用.bind()来确保使用正确的this值调用函数:

function fireArr() {
    this.arr.forEach(function(item){
        console.log(this.inc(item));
    }.bind(this));
}

但是恕我直言,self( that, _this) 变量更容易理解,因为它直接声明不使用正常值this,尽管人们会期望它(例如在事件处理程序中,或 jQuery 的each())。特别是在长函数上,你看不到bind()最后,这很重要。此外,一些古老的浏览器不支持bind(),您需要对其进行填充。

因此,对于任何就地函数表达式,我建议使用解引用变量。

但是,当您在某处定义了一个方法时,它可能会很有用,通常this用于指向当前对象,因为它在该上下文中很常见,然后该方法应该在其他地方使用。为了简单明了,您可以而且应该使用而不是var self-wrapper bind。您的示例提供了一个很好的演示(假设该inc方法使用了this关键字):

this.arr.forEach( this.inc.bind(this) );

(虽然forEach()允许我们传递一个自定义this参数 - 例如事件附件不)

于 2012-08-05T17:40:32.340 回答
3

在您的示例中,该inc函数不使用该this值,因此它不需要是一个方法。您可以将其定义为本地函数:

var Animal = function ( name ) {
    this.name = name;
    this.arr = [ 1, 2, 3, 4 ];

    var inc = function ( num ) {
        return num + 1;
    };

    this.fireArr = function () {
        this.arr.forEach(function ( item ) {
            console.log( inc( item ) );
        });
    };
};
于 2012-08-05T17:49:51.833 回答