我这里有一小段代码,这是我遇到的一些情况的模型。对于我作为PHP程序员来说,这在PHP中很容易做到,但我从来不知道如何在JS中这样做。也许有人可以提供帮助。
var counterObj = {
items: [1,4,7],
total: 0,
run: function() {
$.each(this.items, function(i, item){
// Call my own method
this.add(item);
})
.promise()
.done(function(){
// doubt it will log 12
console.log(this.total);
});
},
add: function(item){
this.total = this.total + item;
}
};
counterObj.run();
答案 0 :(得分:1)
run: function() {
$.each(this.items, function(i, item){
this.add(item);
})
.promise()
.done(function(){
console.log(this.total);
});
}
this
里面的$.each
指的是数组中的数字(责备jQuery)。相反,你应该这样做:
run: function() {
var _this = this;
$.each(this.items, function(){
_this.add(this); //so many "this"
});
console.log(this.total);
}
http://jsfiddle.net/DerekL/EH9qK/4/
顺便说一句,.promise
和.done
仅存在于jQuery对象中。 $.each
返回原始数组。
this
为a really confusing keyword。它也可以使用.apply
进行更改,这是jQuery在其方法中所做的:
也可以通过
this
关键字访问该值,但Javascript将始终将此值包装为Object,即使它是一个简单的字符串或数字值。
来自jQuery's docs
但即使jQuery没有修改this
,它仍然会引用错误的对象(window
)。
哦,是的,1 + 4 + 7
是12
,而不是13
。 :)
答案 1 :(得分:0)
您声明的每个函数都会创建另一个范围。您所要做的就是通过调用bind'方法将函数绑定到counterObject。我不理解“承诺”的使用,但我试图在代码中做尽可能少的更改,以便我的更改很明确。
var counterObj = {
items: [1,4,7],
total: 0,
run: function() {
$.each(this.items, function(i, item){
// Call my own method
this.add(item);
}.bind(this))
.promise()
.done(function(){
// doubt it will log 13
console.log(this.total);
}.bind(this));
},
add: function(item){
this.total = this.total + item;
}
};
counterObj.run();
答案 2 :(得分:0)
您需要从作用域返回应该公开的函数,否则它们将被视为私有。
对于你的例子:
var counterObject = {
...
return {
run: run
};
};