var self=此模式的备选方案
alternative for the var self = this pattern
我正在寻找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/
你知道吗?
提前谢谢。
您可以将第二个参数设置为forEach
,即this
值。
this.arr.forEach(function(item){
console.log(this.inc(item));
}, this);
您可以使用.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
来指向当前对象,因为它在该上下文中很常见,然后应该在其他地方使用该方法。为了简单明了,您可以也应该使用bind
来代替var self
包装器。您的示例提供了一个非常好的演示(假设inc
方法使用了this
关键字):
this.arr.forEach( this.inc.bind(this) );
(尽管forEach()
允许我们传递自定义this
参数-例如,事件附件不允许)
在您的示例中,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 ) );
});
};
};
相关文章:
- 轻量级zxcvbn替代方案
- 正在寻找比$(document).ready慢的$(window).load的替代方案
- ng映射方向备选方案
- Javascript,访问一个主要对象模块模式中的每个对象
- 是否有任何snippet或jQuery插件可以列出easylist.txt模式匹配的DOM中的所有元素
- 试图在引导模式内动态生成图表,得到offsetWidth错误
- 同位素库错误:未捕获错误无布局模式包装生产线8
- 在DOM中查找一个模式并替换它's的内容使用jquery
- 如何缩短MongoDB ObjectId并在Mongoose模式中使用它
- D3.js模式不适用于弧形或圆环图
- 设置多个观察程序以触发动态事件的角度替代解决方案 - 优化的观察者模式
- var self=此模式的备选方案
- JavaScript 模块模式和它的替代方案有什么区别
- 是否有可能让w regexp模式允许诸如é吗?如果不是,还有什么替代方案呢?
- 当模式打开时,任何人都可以建议在firefox中使用箭头键滚动页面的解决方案
- IE7 Quirks模式下jQuery Ui对话框的替代方案
- 此arguments.callee实例的严格模式替代方案
- 带有UpdatePanel的ASP.NET启动模式-可能的解决方案
- 我如何使太多的属性可读模块模式和有任何替代方案
- 克罗克福德式原型模式明白了;寻找一个优雅的解决方案