Javascript 如何调用对象';s方法并使用变量

Javascript 如何调用对象';s方法并使用变量,javascript,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); }) .p

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

这个
$中。每个
都是指数组中的数字(这要怪jQuery)。相反,您应该这样做:

run: function() {
    var _this = this;
    $.each(this.items, function(){
        _this.add(this);  //so many "this"
    });
    console.log(this.total);
}

顺便说一下,
.promise
.done
只存在于jQuery对象中<代码>$。每个
返回原始数组


这是JavaScript中的
。还可以使用
.apply
更改它,这是jQuery在其方法中所做的:

该值也可以通过
this
关键字访问,但Javascript将始终将该值包装为对象,即使它是一个简单的字符串或数字值。

但是,即使jQuery没有修改
这个
,它仍然会引用错误的对象(
窗口


哦,是的,
1+4+7
12
,而不是
13
:)

您声明的每个函数都会创建另一个作用域。您所要做的就是通过调用bind“method”将函数绑定到计数器对象。我不理解“promise”的用法,但我尝试在您的代码中做尽可能少的更改,以便我的更改变得清晰

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();

您需要从您的作用域返回应该是公共的函数,否则它们将被视为私有的

例如:

var counterObject = {
    ...
    return {
        run: run
    };
};

促销。。。。。。。。。我会再看一遍文档的。
。promote()
这是一个新方法还是什么?我没有纠正,拼写错误。希望你只是想搞笑。@SaifBechan-你代码中的问题是
这个
指的是数组中的数字。我不建议使用变量“self”,因为它在浏览器中默认指向“window”对象。“that”或“\u this”会更具可读性。@UdiCohen-谢谢,已更改。
var counterObject = {
    ...
    return {
        run: run
    };
};