输入forEach时的变量重置(javascript)

时间:2012-09-04 08:06:18

标签: javascript jquery undefined

我的代码片有问题,因为当输入以下forEach时,“this.items”变量变为undefined。 正如您所看到的那样,console.log显示如果在forEach中重新定义了this.items

为什么?

仅供参考,我正在使用jQuery 1.8和Classy(jQuery的类管理器)

extractParams : function(params){

    if(params != ""){
        this.items = {};
        params = params.split("&");
        console.log(this.items);

        params.forEach( function(dts){
        console.log(this.items); // = undefined         
            this.keyval = dts.split("=");
            console.log(this.items);

            switch(keyval[0]){
                case "v" : 
                    this.items["Version number"] = this.keyval[1];
                    params = params.filter(function(v) { return !(v === "v=" + this.keyval[1] );});
                    break;
                case "t1" :
                    console.log(this.item);
                    this.items["Event Type"] = this.keyval[1];
                    params = params.filter(function(v) { return !(v === "t1=" + this.keyval[1] );});
                    break;
                default :
                case "" :
                    break;
            }

            switch(true){
                case regItem.test(keyval[0]):
                    this.items["Product Id n°" + this.keyval[0].match(regexpParamNumber)[1]] = this.keyval[1];
                    params = params.filter(function(v) { return !(v === "i"+this.keyval[0].match(regexpParamNumber)+"=" + this.keyval[1] );});
                    break;
                case regQuantity.test(keyval[0]):
                    this.items["Quantity n°" + keyval[0].match(regexpParamNumber)[1]] = keyval[1];
                    params = params.filter(function(v) { return !(v === "q"+keyval[0].match(regexpParamNumber)+"=" + keyval[1] );});
                    break;
                default :
                case "" :
                    break;
            }

        })
        console.log(result);
        result[0] = detectTrackerType(this.items);  
        show(result);
    }
    return this.items;
}

3 个答案:

答案 0 :(得分:1)

这是'this'的本质 - 每次输入函数this都会被重置。

尝试

extractParams : function(params){
var that = this;

然后在整个代码中使用that

编辑:找到值得一读的讨论: What does 'var that = this;' mean in JavaScript?

答案 1 :(得分:0)

this在javascript中有点棘手。在函数开头尝试var self = this;,然后在代码中使用self

答案 2 :(得分:0)

您需要将this分配给self等其他内容,然后在代码中引用self而不是this

extractParams : function(params){
    var self = this;

    if(params != ""){
        self.items = {};
    ....
    params.forEach( function(dts){
        console.log(self.items); // = undefined    

您需要执行此操作,因为this更改的范围取决于您在代码中的位置。在嵌套函数中this的范围是内部函数而不是外部函数。