2012-08-10 29 views
1

我正在閱讀John Resig的書籍「JavaScript忍者的祕密」,並在其中解釋瞭如何通過使用此代碼擴展對象原型來嘗試預測未來語言的功能:此JavaScript代碼的後果

if(!Array.prototype.forEach){ 
    Array.prototype.forEach = function(fn, callback){ 
     for(var i = 0; i < this.length; i++){ 
     fn.call(callback || null, this[i], i, this); 
     } 
    }; 
} 

現在,我明白了「callback || null」語句阻止向「調用」函數傳遞一個可能的未定義值。我不明白的是,將null作爲「fn」參數的上下文傳遞的後果可能是什麼。這不會讓代碼崩潰嗎?

感謝您提供任何解釋和/或啓示。

+1

'callback'不是描述性變量名稱。 'fn'實際上是回調函數,''回調函數'this'的值... – pimvdb 2012-08-10 17:39:13

+1

通常名稱'scope'用於使用'callback'的地方。 'callback'意味着我的功能。 – 2012-08-10 17:40:30

+0

'this_obj'將會是這個參數的一個更好的名字。 – 2012-08-10 18:06:34

回答

1

沒有「真正」的問題與此相關,語境「這」恰好等於null,則。 這是使用.call()或.apply()時常用的方法,如果您沒有適當的上下文值。

1

Function.call的第一個參數是運行函數的範圍。如果該參數是falsey(null是falsey的一種形式),那麼它將在全局範圍內運行該函數。在瀏覽器中,這意味着該函數將以this設置爲window運行。

callback || null不需要,如果您通過undefined作爲範圍,它將使用window。儘管可能存在一些模糊的瀏覽器或不存在的情況,這可以解釋Resig爲什麼這麼做。

+1

作用域意味着[完全不同](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Functions_and_function_scope)比你使用它的 – Esailija 2012-08-10 17:49:06

+0

不幸的是,'範圍'這個術語變得相當渾濁JavaScript世界。許多人,框架,庫等使用術語「範圍」來表示「調用函數時'this'的目標」 – 2012-08-10 19:35:41

+0

在環顧四周,我認爲我最喜歡的名字是'context',它是下劃線.js使用。 – 2012-08-10 19:38:52