无法从函数内部覆盖函数

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)


Sal*_*n A 8

您正在使用函数表达式:

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() {

这是一个函数声明 ; 这里适用不同(更明显)的规则.