var self的另一种选择=这种模式

时间:2012-08-05 17:38:13

标签: javascript

我正在寻找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/

你知道吗?

提前致谢。

3 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:5)

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

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

但imho selfthat_this)变量更容易理解,因为它直接表明不使用正常的this值,尽管会有期待它(例如在事件处理程序中,或jQuery的each())。特别是在长期功能上,你最终看不到bind(),这很重要。此外,一些古老的浏览器不支持bind(),您需要对其进行填充。

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

但是当你在某个地方定义了一个方法时它通常很有用,通常使用this指向当前对象,因为它在该上下文中很常见,然后该方法应该在其他地方使用。您可以而且应该使用var self来代替bind - 包装器,以简化和清晰。您的示例提供了相当不错的演示(假设inc方法使用了this关键字):

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

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

答案 2 :(得分: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 ) );
        });
    };
};