JavaScript中为什么找不到条件语句中定义的函数

在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的变量是怎么回事?可以说在代码块中定义一个函数,就会多出一个与这个函数名相同的一个变量吗?如果是变量提升我还能理解,函数提升我也能理解,但是函数却以变量形式提升我就有点不明白了。

慕桂英3389331
浏览 681回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript