ES6循环和forEach中的上下文和变量范围

时间:2016-02-28 16:44:37

标签: javascript foreach scope this ecmascript-6

在ES5中,如果我必须在子函数中引用父函数的this上下文,我必须将它存储在变量中并使用该变量在子函数内访问它。

像这样......

//  variant 1
var self = this;
this.nums.forEach(function (v) {
if (v % 5 === 0)
   self.fives.push(v);
});

ECMAScript有箭头功能,所以我可以避免这种情况:

// variant 2
this.nums.forEach((v) => {
 if (v % 5 === 0)
   this.fives.push(v)
})

我的问题是:如果我要在上面的temp函数中声明变量forEach,这会污染我的全局范围吗?如果是这样,会出现性能问题和可变冲突吗?

在for循环中发生了类似的事情......

//variant 3
for(var i =0 ;i.......){
   var temp = "tempvariable";
   //some code here
 }

 console.log(temp);
 //output : tempvariable

variant2 variant3 代码段之间有什么区别?

1 个答案:

答案 0 :(得分:5)

常规函数使用执行上下文来设置this的值,这意味着在大多数情况下,this的值由函数的调用方式决定,即{{1}的值根据执行函数的环境设置。

箭头函数没有自己的this值,而是使用词法作用域,这意味着箭头函数内的this值始终从封闭范围继承,即设置为封闭执行上下文的this值。

documentation以及

中对此进行了解释
  

在箭头函数之前,每个新函数都定义了自己的this值   (构造函数中的新对象,在严格模式下未定义)   函数调用,如果函数被调用为上下文对象   "对象方法"等)。事实证明这很烦人   面向对象的编程风格。
  ....
  箭头函数捕获封闭上下文的此值

发布的第三个示例只是一个常规this循环,与函数几乎没有共同点,并且无法与两个第一个代码示例进行比较。
for循环在ES2015中的工作方式与以往一样,在变量的for循环中通常没有特殊范围,因为变量(使用for定义)是功能范围。

然而,ES2015确实引入了可以作为块作用域的变量,而var循环实际上是一个块for,这些变量可以是已使用,并使用for (what) {block}关键字或let关键字定义常量(无法更改)

对于那些喜欢代码的人

const