2

次の forEach を入力すると、「this.items」変数が未定義になるため、コードに問題があります。ご覧のとおり、console.log には、this.items が forEach で再定義されていることを示すものがあります。

なんで?

参考までに、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;
}
4

3 に答える 3

1

これは「this」の性質です。関数に入るたびthisにリセットされます。

試す

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

次にthat、コード全体で使用します。

編集: 読む価値のあるディスカッションを見つけました: What does 'var that = this;' JavaScriptでの意味?

于 2012-09-04T08:12:12.023 に答える
0

thisJavaScript では少しトリッキーです。var self = this;関数の冒頭でこれを試してから、self代わりにコードで使用してください。

于 2012-09-04T08:12:36.883 に答える
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では、外側の関数ではなく内側の関数にスコープが設定されます。

于 2012-09-04T08:13:44.073 に答える