如何调用对象的方法并使用变量

时间:2014-02-23 07:29:15

标签: javascript

我这里有一小段代码,这是我遇到的一些情况的模型。对于我作为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();

http://jsfiddle.net/EH9qK/

3 个答案:

答案 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返回原始数组。


JavaScript中的{p> thisa really confusing keyword。它也可以使用.apply进行更改,这是jQuery在其方法中所做的:

  

也可以通过this关键字访问该值,但Javascript将始终将此值包装为Object,即使它是一个简单的字符串或数字值。
  来自jQuery's docs

但即使jQuery没有修改this,它仍然会引用错误的对象(window)。

哦,是的,1 + 4 + 712,而不是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
    };
};