在Secrets of Javascript Closures,司徒Langridge呈現的代碼來演示在.onclick回調封閉的共同使用的一個片段,並轉述:如何使用Object.prototype.bind()重新實現'var that = this'來保存範圍引用?
link.onclick = function (e) {
var newa = document.createElement("a");
var that = this;
document.body.appendChild(newa);
newa.onclick = function (e) {
that.firstChild.nodeValue = "reset";
this.parentNode.removeChild(this);
}
}
我最近偶然發現了凱爾辛普森一家議長甲板New Rules For Javascript和他提到將this
的範圍保存爲var self = this
或(如片段中所示)var that = this
這樣的封閉是「誤導」的,並且是Object.prototype.bind()
的情況。除了ES5兼容性外,我更傾向於傾聽語言結構來解決問題,而不是使用黑客或快速修復,但在此代碼段中,使用bind
,apply
或call
的問題是,對包含值this
並且需要關閉的參考值this
。
這是一個實用性勝過哲學的例子嗎?可以做什麼?
在像你需要兩個參考你的情況下,我認爲你不能避免存儲實例的引用。如果它讓你覺得任何更清潔的東西,你可以將外部實例作爲參數傳遞給包裝內部函數的自調用匿名函數,但在語義上,這將是相同的。 – xbonez
我已經看到過以前使用過的,並且從描述中可以明白爲什麼使用它:使用閉包來保存引用範圍的狀態。你是對的,它在語義上是相同的,但由於某種原因,只是感覺_better_,儘管我可以對原始類的一流功能進行某種沙文主義! – lintuxvi