在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 代码段之间有什么区别?
答案 0 :(得分:5)
常规函数使用执行上下文来设置this
的值,这意味着在大多数情况下,this
的值由函数的调用方式决定,即{{1}的值根据执行函数的环境设置。
箭头函数没有自己的this
值,而是使用词法作用域,这意味着箭头函数内的this
值始终从封闭范围继承,即设置为封闭执行上下文的this
值。
在箭头函数之前,每个新函数都定义了自己的
this
值 (构造函数中的新对象,在严格模式下未定义) 函数调用,如果函数被调用为上下文对象 "对象方法"等)。事实证明这很烦人 面向对象的编程风格。
....
箭头函数捕获封闭上下文的此值
发布的第三个示例只是一个常规this
循环,与函数几乎没有共同点,并且无法与两个第一个代码示例进行比较。
for
循环在ES2015中的工作方式与以往一样,在变量的for
循环中通常没有特殊范围,因为变量(使用for
定义)是功能范围。
然而,ES2015确实引入了可以作为块作用域的变量,而var
循环实际上是一个块(for
),这些变量可以是已使用,并使用for (what) {block}
关键字或let
关键字定义常量(无法更改)。
对于那些喜欢代码的人
const