2013-10-18 51 views
6

我在我的Class的一個方法中使用forEach遍歷數組。我需要訪問forEach中的類的實例,但是這個未定義。在forEach循環中訪問this會導致undefined

var aGlobalVar = {}; 

(function() { 

    "use strict"; 

    aGlobalVar.thing = function() { 
     this.value = "thing"; 
    } 

    aGlobalVar.thing.prototype.amethod = function() { 
     data.forEach(function(d) { 
     console.log(d); 
     console.log(this.value); 
    }); 
} 
})(); 

var rr = new aGlobalVar.thing(); 
rr.amethod(); 

我有一把小提琴我在這裏工作:http://jsfiddle.net/NhdDS/1/

+1

那麼我確實有完整腳本中的局部變量。這僅僅是這個例子的一個簡單的片段。 –

+0

當然,似乎有點奇怪。 –

+1

@ Qantas94Heavy:也讓他在嚴格的內部製造東西。 –

回答

17

在嚴格模式下,如果你調用一個函數通過屬性參考,並沒有指定this應該是什麼,它的undefined.

forEachspec | MDN),可以說this應該是什麼,它的(可選)第二個參數傳遞給它:

aGlobalVar.thing.prototype.amethod = function() { 
    data.forEach(function(d) { 
    console.log(d); 
    console.log(this.value); 
    }, this); 
    // ^^^^ 
} 

或者,arrow functions加入的JavaScript在2015年由於箭關過this,我們可以用這個:

aGlobalVar.thing.prototype.amethod = function() { 
    data.forEach(d => { 
    console.log(d); 
    console.log(this.value); 
    }); 
} 
+0

不知道這個!絕對比將這個**存儲在臨時變量中並在** foreach **上下文中使用更清晰。感謝分享! –

+0

我正在跟這個。我正在Chromium上構建一個應用程序,因此在這種情況下ECMA5很好。謝謝 –

+0

我不認爲在TypeScript中有一種方法可以在'forEach'循環中告訴IDE'this'的類型嗎?我目前正在執行以下'const self = this',然後使用'self'從我的IDE獲取自動完成 - 不理想 –

4

由於您使用的是嚴格模式,因此當調用的函數不是對象的屬性時,默認情況下(不是全局對象),this的值將爲undefined。您應該手動存儲它的值:

var aGlobalVar = {}; 

(function() { 
    "use strict"; 

    aGlobalVar.thing = function() { 
     this.value = "thing"; 
    }; 

    aGlobalVar.thing.prototype.amethod = function() { 
     var self = this; 
     data.forEach(function (element) { 
      console.log(element); 
      console.log(self.value); 
     }); 
    }; 
})(); 

var rr = new aGlobalVar.thing(); 
rr.amethod(); 

如今,隨着ES2015還可以使用arrow functions,它使用this值外功能:

function foo() { 
    let bar = (a, b) => { 
    return this; 
    }; 

    return bar(); 
} 

foo.call(Math); // Math 

T.J.使用forEach的第二個參數Crowder的解決方案也很好地工作,如果你不喜歡臨時變量的想法(ES5代碼:現在幾乎可以在任何瀏覽器中工作,除了IE8-)。

+0

謝謝。我知道這一點。我不知道爲什麼我沒有使用它!順便說一句,應該是console.log(thing.value);在上面的代碼中? –

+0

@MikeRifgin:哈哈,是的。 –