Appearance
具名函数表达式和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
错误。
这表明具名函数表达式的函数名只能在函数体内部使用,并且在函数体外部是不可访问的。