在Chrome中实验以下代码:function f(){ console.log("outside f()");}+function (){ if(false){ function f(){ console.log("inside f()"); } } f(); // Uncaught TypeError: f is not a function}();在外部定义函数f,它输出"outside f()",而在之后的IIFE中也定义了一个f,然后执行这个f函数,但是输出Uncaught TypeError: f is not a function。但是,如果我把if条件改为true,则会输出inside f()。我注意到,这个异常是TypeError类型错误,这说明它确实找到了f这个变量,但是它不是一个函数类型,这似乎表明在这个IIFE作用域中已经存在一个f变量,它屏蔽了外部的f函数。我不明白这个机制到底是怎么回事。不是说函数和变量会有一个提升过程吗?此时无论if语句是什么,内部的f应该是能找到才对,再不济还可以按照作用域链上寻查找到外部定义的f函数呀?此时内部莫名其妙多出一个名为f、值是undefined的变量是怎么回事?可以说在代码块中定义一个函数,就会多出一个与这个函数名相同的一个变量吗?如果是变量提升我还能理解,函数提升我也能理解,但是函数却以变量形式提升我就有点不明白了。
添加回答
举报
0/150
提交
取消