Skip to content

NFE和IIFE

🕒 Published at:

具名函数表达式和IIFE

具名函数表达式(NFE)是指在函数表达式中给函数命名的形式。这个名字只能在函数体内部访问,并且在函数体内这个名字是不可变的。立即执行函数表达式(IIFE)是一种在定义时立即调用的函数表达式。

示例一:具名函数表达式中的自由变量

javascript
(function A() {
    console.log(A); // [Function A]
    A = 1;
    console.log(window.A); // undefined
    console.log(A); // [Function A]
}());

在这个示例中,A是一个具名函数表达式。在函数体内部,可以通过A访问函数自身,但由于A被视为常量,尝试修改A的值不会生效。因此,输出结果如下:

  • 第一个console.log(A);打印的是函数自身 [Function A]
  • A = 1; 试图修改A的值,但没有生效。
  • console.log(window.A); 打印 undefined,因为A并没有作为全局变量存在。
  • 第三个console.log(A);依然打印函数自身 [Function A]

示例二:变量提升和函数表达式

javascript
(function A() {
    console.log(A); // undefined
    var A = 1;
    console.log(window.A); // undefined
    console.log(A); // 1
}());

在这个示例中,A是一个变量声明而不是具名函数表达式。由于变量提升,var A在函数作用域内被提升到顶部,但没有赋值,因此初始值为undefined。输出结果如下:

  • 第一个console.log(A);打印 undefined,因为var A声明被提升。
  • var A = 1;A赋值。
  • console.log(window.A); 打印 undefined,因为A是函数内部的局部变量,并没有作为全局变量存在。
  • 第三个console.log(A);打印 1,因为此时A已经被赋值为1

结论

在具名函数表达式中,函数名是只读的,并且只能在函数体内部访问。尝试修改函数名不会生效,而在变量提升的情况下,变量在作用域内被提升,但只在声明处赋值。

具名函数表达式的特性

下面是一个具名函数表达式的示例,进一步说明它的特性:

javascript
var testFun = function a() {
    console.log(typeof a); // function
    console.log('我是具名函数表达式');
};
testFun();
console.log(typeof a); // 报错,ReferenceError: a is not defined

在这个示例中:

  • testFun 是一个函数表达式,函数名是 a
  • 在函数体内部,a 可以访问并且是类型 function
  • 在函数体外部,a 不可访问,会抛出 ReferenceError 错误。

这表明具名函数表达式的函数名只能在函数体内部使用,并且在函数体外部是不可访问的。