2013-03-11 34 views
0

在書中Oreilly.JavaScript.The.Good.Parts,有一塊這樣的代碼:爲什麼在閉包中使用var slice而不是Array.prototype.slice?

Function.method('curry', function() { 
    var slice = Array.prototype.slice, 
     args = slice.apply(arguments), 
     that = this; 
    return function() { 
     return that.apply(null, args.concat(slice.apply(arguments))); 
    }; 
}); 

我不知道爲什麼不直接Array.prototype.slice而不是私有變量,謝謝。

+0

可能會緩存切片方法供以後使用..! – 2013-03-11 10:28:55

+0

性能和可讀性,我猜... – 2013-03-11 10:29:02

+1

也許readablity?或者稍後有人可能'Array.prototype.slice',你會得到意想不到的結果。 – Zeta 2013-03-11 10:29:15

回答

0

它不會定義slice,但在此函數中有兩個調用Array.prototype.slice,所以最好定義一個「快捷方式」,以使其看起來更好(代碼更短,冗餘更少)。

0

從性能角度來看,slice在下面的代碼被使用兩次。使用快捷方式將減少輸入代碼的長度和查找過程。

如果你在一個局部變量有片,還有就是當你訪問它需要單個查找:

  • getVar「切片」

相比之下,使用Array.prototype.slice通常翻譯爲幾個「指令「:

  • getVar 「陣列」
  • getMember 「原型」
  • getMember「切片」

從微小的角度來看,如谷歌編譯工具也將進一步通過重命名局部變量(在這種情況下slice)到單個字母變量減小尺寸的代碼。在範圍外訪問的全局變量不會發生這種情況(在這種情況下,Array.prototype.slice)。

從功能的角度來看,Array.prototype.slice是動態解析,所以它可在以後更改。分配一個本地參考函數對象指向Array.prototype.slice在那個時間點保證沒有其他的代碼可以改變功能引用,你現在持有自己。

1

我認爲這是一個不錯的,不是必須的,即無論哪種方式會工作。

這是稍微容易用別名來讀取(因爲你有更少的代碼來解析)。

如果curried方法經常被調用,那麼別名將提高性能,因爲JavaScript不必經過複雜規則來解除引用Array然後prototype

最後,有人可能會覆蓋Array.prototype.slice後(不太可能)或作者可能覆蓋它調用這個函數(也不可能)。因此,代碼確保在稍後調用它時,它的行爲就像您已經立即執行它一樣。

相關問題