箭头函数的性能和内存占用问题

3

ES6提供了箭头函数,例如:

var quadr= x => x * x;

我知道这会影响thisargumentssupernew.target绑定。来源

这对于确保每个作用域中的this正确无疑很有用。但我想知道这种绑定是否会影响脚本的内存占用。执行上下文中的对象是否较少?这是否会影响函数的性能?
当我们在箭头函数内部引用this时会发生什么(关于内存和分配),例如:

function person(){
  this.age=0;
  //it's my birthday so...
  ()=>{
     this.age++;
  }
}

不用在意。这已经足够好了。 - Jonas Wilms
1
几乎所有你所问的都取决于浏览器的实现。在我看来,由于绑定的存在,内存使用量可能会略微增加,类似于使用anonymouns.bind(this)之类的东西,但这不应该阻止你使用它,因为当你需要一个恒定的执行上下文时,它将为你节省很多麻烦。 - Dayan Moreno Leon
这是一个闭包,并且会像任何其他闭包一样执行。 - Bergi
1个回答

1

当我们在箭头函数内部引用this时,会发生什么(关于内存和分配)?

每当函数被调用时,都会创建一个词法环境,其中包含对其定义的词法环境的引用。所以想象一下这样的情况:

function a(){
  function b(){
  }
  b.call(bContext)
}
a()

词法环境具有指向当前上下文(也称为this)的值以及对其封闭词法环境的引用。因此,如果内部函数被调用,则环境将如下所示(伪代码):

a{
  this:window
}
b{
 parent:a
 this:bContext
 }

让我们想象b将成为一个箭头函数:
function a(){
  b=()=>{};
  b();
}

那么它就没有上下文,会在a的环境中查找:

a{
  this:window//
}
b{
 parent:a
 }

因此,箭头函数比常规函数更加轻量级。

1
在调用函数之前,既没有词法环境也没有 this 值。你能否修复你的示例脚本以反映这一点? - Bergi
this:null与根本没有this是不同的。 - Bergi
@Bergi 好的,已编辑 - Jonas Wilms
我的意思是你应该在你的示例中添加一些a()b()调用,这样this在示例中也有一些明确的值,而不是“窗口或其他什么”。 - Bergi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接