我正在寻找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/
你知道吗?提前致谢。
答案 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 self
(that
,_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 ) );
});
};
};