2016-01-24 41 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中,你明确地绑定它...很酷,很酷。 –

相关问题