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
的变量是怎么回事?可以说在代码块中定义一个函数,就会多出一个与这个函数名相同的一个变量吗?如果是变量提升我还能理解,函数提升我也能理解,但是函数却以变量形式提升我就有点不明白了。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
其实函数也就是一个变量啊,只不过是类型是函数罢了。
函数的提升可以这么理解
等价于
现在比较新版本的chrome和firefox下应该都是这样的,也就是说,if或是block({})内的函数声明不会被提前到外部,同时在这些地方进行函数声明也不符合规范。
具体可以看http://statichtml.com/2011/sp...
可以把它看成是这样的
日经问题。
条件语句块中声明的函数,其效果等同于在此处声明的函数表达式。
在你这里,由于变量提升,以
+
开头的匿名函数里面,首先声明变量f
,然后到了条件语句内部才会定义其函数,而你的条件语句是永远失败的,所以这里你只会找到未初始化的变量f
,而不是函数f
。