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

发布于 2022-09-05 10:09:43 字数 979 浏览 26 评论 0

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

可遇━不可求 2022-09-12 10:09:43

其实函数也就是一个变量啊,只不过是类型是函数罢了。
函数的提升可以这么理解

if(false){
    function f(){
        console.log("inside f()");
    }
}

等价于

var f;
if(false){
    f = function(){
        console.log("inside f()");
    }
}

现在比较新版本的chrome和firefox下应该都是这样的,也就是说,if或是block({})内的函数声明不会被提前到外部,同时在这些地方进行函数声明也不符合规范。
具体可以看http://statichtml.com/2011/sp...

旧人九事 2022-09-12 10:09:43

可以把它看成是这样的

function() {
    if (false) {
        var f = function() { console.log("inside f()"); };
    }
}
在你怀里撒娇 2022-09-12 10:09:43

日经问题。

条件语句块中声明的函数,其效果等同于在此处声明的函数表达式。

在你这里,由于变量提升,以+开头的匿名函数里面,首先声明变量f,然后到了条件语句内部才会定义其函数,而你的条件语句是永远失败的,所以这里你只会找到未初始化的变量f,而不是函数f

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文