2016-01-24 14 views
2

我看到這個談話(具體時間安排是故意這只是對迭代器的魔力,還是這是一個更一般的基礎事物?

https://www.youtube.com/watch?v=lil4YCCXRYc?t=24m51s

在板有這一段代碼(實際上是類似的一個):

var it = [8,9 0][Symbol.iterator]() 
//This gives me an ArrayIterator{...} 

我注意到,如果我嘗試做它在2個步驟,在Chrome中,它失敗:

var nums = [9,8,7] 
var it = nums[Symbol.iterator] 
it = it() 
// in the console, this throws 'Uncaught TypeError: Cannot convert undefined or null to object(…)' 

幾乎知道一些JavaScript,我注意到,如果我做了

var it = nums[Symbol.iterator] 
it.apply(nums) 
// I again get the ArrayIterator 

這是什麼魔法? var x = obj[method]()var x = obj[method]; x = x()

回答

2

這是關於上下文的全部內容。當您撥打it()時,它在全局名稱空間中執行,並且this指的是window。但是它應該參考數組[9, 8, 7]。通過調用it.apply(nums)您可以更改上下文,這是它工作的原因。

結合上下文的另一種方式是:

var nums = [9,8,7]; 
var it = nums[Symbol.iterator].bind(nums); 
it(); 

現在只要您撥打it()它總是在nums陣列的上下文中運行。

+1

有趣的是,我知道這個上下文切換,它仍然讓我!我主要用Python工作,並且在那裏,綁定什麼,保持綁定。你必須明確地去綁定它,而在JS中,你明確地綁定它...很酷,很酷。 –

相關問題