我有以下代碼:使用Javascript - 無法理解的封閉
function bird(type) {
return function (whattosay) { //return the whole function
console.log (type + ' ' + whattosay)
}
}
var birdRef = bird('blackbird');
birdRef('singing in the dead of night');
var secondRef = bird('whitebird');
birdRef('singing after that night');
我試圖讓熟悉的兩個概念,關閉和作用域鏈。 那麼,在我的第一個birdRef中,我得到一個新的函數對象,然後在該行之後調用它。最後,我在控制檯上看到「夜深人靜的黑鳥在唱歌」。我明白爲了找到鳥類型var,閉包給了你一個父對象的引用,並且它在作用域鏈中有點尋找那個var並最終找到它,所以我們可以看到它的類型。
那麼,你有這樣的:
var secondRef = bird('whitebird');
一個新的說法已經過去了,所以現在的VAR「類型」中的鳥函數改爲從黑鳥到whitebird。
現在我回來我以前創建的函數birdRef,我不明白的是,接下來會發生什麼:
birdRef('singing after that night');
我得到的,而不是whitebird「那一夜後黑鳥唱歌」。那麼,如果我沒有弄錯,birdRef函數是不是它的父函數bird,並且讀取了更新的bird變量的類型(我的意思是他在當地環境中找不到那個var,所以他看着外面的環境,並發現變種「類型」)?
對不起,如果我沒有多少意義,因爲我是新手,並感謝您的時間。
不,每個函數調用都會創建一個具有不同'type'變量的新上下文(環境)。 'birdRef'和'secondRef'是兩個不同的函數對象,它們關閉了兩個不同的變量。 – Bergi
因此,每個鳥類函數調用都會創建一個適合調用者的新鳥類函數? – RunningFromShia
正確,每個'bird()'返回一個新的函數(使用相同的代碼但不同的上下文) – Bergi