Lirx-Xin / LirxdeBlog

blog记录
0 stars 0 forks source link

关于js自执行函数内打印函数变量问题 #18

Open Lirx-Xin opened 1 year ago

Lirx-Xin commented 1 year ago
var b = 10;
(function b(){
    b = 20;
    console.log(b);
})();

这是一道面试题,程序执行结果是打印了函数b的内容 如果在程序最后再次打印b的话,会发现此时b的值还是10,也就是自执行函数中的赋值语句没有修改全局上下文中的b变量,这是为什么呢? 通过https://segmentfault.com/q/1010000002810093这里的回答,才了解到: 这个立即执行函数中的函数定义其实是函数表达式(IIFE),而且是具名的函数表达式(NFE),类似于:

var b = function b() {}

而NFE有两个特性,1.函数名标识符只能在函数中访问。2.函数名标识符是不可修改的。 所以在上面的程序中,b=20语句是无效的; 而此时我们如果把b=20,改成a=20;就会发现,window下定义了个a变量,值为20,这也是遵循NFE特性的;