2011-06-18 18 views
17

如這裏說:Function.bind vs Javascript中的閉包:如何選擇?

http://jqfundamentals.com/book/index.html

閉包也可以用來解決與此關鍵字, 這是唯一的每個範圍的問題。這個 機制在處理回調時可能特別有用 ,儘管在 這些情況下,通常最好使用Function.bind,這將避免任何 與範圍 遍歷相關的開銷。

但它並沒有真正說出如何區分這兩種情況。事實上,我不明白作者的意思是「避免與範圍遍歷相關的任何開銷」。你可以解釋嗎?

+5

關閉方法似乎要快兩倍http://jsperf.com/bind-vs-closure-performace – sbr

+2

鏈接已損壞。 「對不起,你在找什麼不在這裏」 – Luke

+0

@sbr我的電腦上速度提高了25倍 – Supersharp

回答

9

看看這條線中的示例在上面的鏈接

console.log(self.myName, this.myName); 

(帶自=此;幾行以上)。閉包定義的outerFunction方法存在於不同的作用域中,這就是爲什麼它與outerObj對象具有不同的值。 (self.myName!= this.myName)

作用域遍歷意味着,當您想要獲取存在於不同作用域中的值(變量,對象)時,因此會增加額外開銷(代碼執行速度會變慢) 。

使用綁定,您正在調用一個具有現有範圍的函數,以便範圍遍歷不會發生。

+2

*代碼執行變慢* - 這是完全錯誤的,如sbr的註釋和其他SO問題所示:http://stackoverflow.com/questions/17638305/why-is-bind-slower-than-a-closure – adelphus

+0

Can您提供了更多關於您添加的代碼行的上下文?原問題中提供的鏈接不再有效。 – Luke

+0

另外,您是否可以提供任何文檔或證據來解釋「何時您將獲取存在於不同範圍內的值,並增加額外開銷」。上面通過@sbr鏈接的性能檢查似乎表明,關閉是相同的 - 甚至更快。 – Luke

7

它指的是什麼這樣的事情

obj.doSomething = function() { 
    var that = this; 
    setTimeout(function() { 
    // this is the window 
    // that is the obj 
    that.doSomethingElse(); 
    }, 50); 
}; 

VS

obj.doSomething = function() { 
    setTimeout((function() { 
    // this is the obj 
    this.doSomethingElse(); 
    }).bind(this), 50); 
}; 

Benchmark。鉻無顯着差異。

+0

由於函數調用發生在微秒,setTimeout是10毫秒+,所以setTimeout的低定時分辨率造成的差異不是這樣嗎? – jpillora

+0

是的,但是兩者中的哪一個被認爲是最佳實踐(即「最好閱讀」)? –

+0

@LinusUnnebäck認爲是個人偏好。我完全避免在JavaScript中使用'this',因爲這兩個變體都很難看。 – Raynos