匿名函数赋值变量是否在本地可用?

时间:2017-08-20 21:58:45

标签: javascript

我一直认为匿名函数没有name,但分配的情况并非如此:



const foo = () => {};

console.log(foo.name); // expected "" but got "foo"




这让我想知道变量名是否也是匿名函数的本地名称:

const fact = n => n > 0 ? n * fact(n - 1) : 1;
//                            ^
//                            |
//                Is fact a local variable?

如果它不是本地的,那么对于像fact这样的递归函数,我们需要沿着范围链向上移动。显然,这不是一个主要的性能问题。不过,我很想知道函数变量名是否在匿名函数中是本地的。

2 个答案:

答案 0 :(得分:3)

  

我很想知道函数变量名是否在匿名函数中是本地的。

没有。这只是命名函数表达式的情况(即使在那里也是not exactly a local variable)。

  

我们需要走近范围链。显然,这不是一个主要的性能问题。

根本不是的性能差异。范围链是静态的,对于变量范围内的性能而言,它并不重要。

  

我一直认为匿名函数没有名称,但在分配时并非如此。

是,it's a new ES6 feature直接分配给变量的匿名函数表达式将设置其.name属性。但是,这与他们的范围无关。

答案 1 :(得分:0)

似乎它确实不是一个局部变量:



var fact = n => n > 0 ? n * fact(n - 1) : 1;

var foo = fact;

fact = x => x;

console.log(foo(5));




由于答案是20而不是120,我们知道它正在遍历范围链。