Lea*_*eaf 12 javascript scope function
我得到了意想不到的结果.这是代码:
b = function c() {
console.log(c);
c = 3;
console.log(c);
}
b();Run Code Online (Sandbox Code Playgroud)
我认为第二个console.log应该打印"3",但我得到了函数本身.为什么?
同时,从下面的代码我得到了正确的"3".
function ff() {
ff = 3;
console.log(ff);
}
ff();Run Code Online (Sandbox Code Playgroud)
meh*_*mpt 11
您不能在其自己的声明中覆盖函数的命名变量.NFE(命名函数表达式)名称不能被覆盖(因为它是常量)
在严格的JS模式下编写时很明显.试试下面的例子:
'use strict';
var b = function c(){
console.log(c);
c = 3; // c still is a function
console.log(c);
}
b();Run Code Online (Sandbox Code Playgroud)
您正在使用函数表达式:
FunctionExpression:
function Identifier opt(FormalParameterList opt ){FunctionBody}
所以b = function c() { ... };完全有效,严格模式或其他方式.发生了什么c是另一个问题.根据规格:
生产
FunctionExpression:函数标识符(FormalParameterList opt){FunctionBody}
的计算方法如下:[...]
3.调用envRec 的CreateImmutableBinding具体方法,将Identifier的String值作为参数传递.
4.让闭包成为创建13.2 [...]中指定的新Function对象的结果
.5.调用envRec的InitializeImmutableBinding具体方法,将Identifier和closure的String值作为参数传递.
[...]注意
FunctionExpression中的标识符可以从FunctionExpression的FunctionBody内部引用,以允许函数递归调用自身.但是,与FunctionDeclaration不同,FunctionExpression中的标识符不能被引用,也不会影响包含FunctionExpression的范围.
所以:
c 在函数内部可见,但不在其外部c 不能从函数内部覆盖("不可变"绑定)同时,从下面的代码我得到了正确的"3".
function ff() {
这是一个函数声明 ; 这里适用不同(更明显)的规则.