JS预解析中 { }大括号会阻止函数声明提升的预解析吗? 急急急

汪末末 2021-04-24 06:17:34

根据JS预解析 以下代码为什么会报一个Uncaught TypeError: test is not a function 这样的错误呢?


test();
if(true) {
function test() {
alert('javascript')
}
}else{
function test(){
alert('node.js')
};
}


我原本是认为根据JS预解析, 函数声明不是会被提升吗? 是因为{ } 大括号的原因不能被提升到作用域的顶部吗?
也就是根据函数声明提升的话 应该是如下形式呀

function test() {
alert('javascript')
}
function test(){
alert('node.js')
};
test();//会正常的输出node.js , 而前面那个函数被覆盖
if(true) {

}else{

}


但是换成以下代码会正常输出

if(true) {
function test() {
alert('javascript')
}
}else{
function test(){
alert('node.js')
};
}
test();



但结果好像不是这样推理! 求大神解答 谢谢!!!
...全文
224 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
六卿 2021-04-26
  • 打赏
  • 举报
回复
上来进行test函数,当时还没有这个函数,函数提升没有到全局,而先判断会将函数加到执行栈中等待,一直到你下面执行
汪末末 2021-04-25
  • 打赏
  • 举报
回复
引用 1 楼 TOUTEII 的回复:
你上来就test(),这个时候还没加载完下面的部分。也就是test()函数内容还未被创建
我说了啊 这种代码是正确的

if(true) {
            function test() {
                alert('javascript')
            }
        }else{
            function test(){
                alert('node.js')
            };
        }
        test();

我的意思是 预解析函数声明会提前的! 你把if去掉把函数调用写上面也可以正确执行啊。!
TOUTEII 2021-04-25
  • 打赏
  • 举报
回复
引用 3 楼 汪末末 的回复:
[quote=引用 1 楼 TOUTEII 的回复:]你上来就test(),这个时候还没加载完下面的部分。也就是test()函数内容还未被创建
我说了啊 这种代码是正确的

if(true) {
            function test() {
                alert('javascript')
            }
        }else{
            function test(){
                alert('node.js')
            };
        }
        test();

我的意思是 预解析函数声明会提前的! 你把if去掉把函数调用写上面也可以正确执行啊。!
[/quote]if里面会进行判断然后创建函数。而非通常直接加载函数,因此在你叫test()函数的时候,线程没走到if判断那里。这就是为什么写下面可以
weixin_37226778 2021-04-25
  • 打赏
  • 举报
回复
js中的提升分为两部分,声明的提升和赋值的提升。 在块级作用域中的funcion会提升,提升到全局和代码块顶部。function声明的提升会提升到全局,但function函数体只会提升到块作用域顶部 当执行到function的声明语句,会把声明语句之前的值复制给全局。 可以用这种方式在两个断点处输出test。

debugger;
    if(true){
        debugger
        function test() {
            alert('javascript')
        }
    }
TOUTEII 2021-04-24
  • 打赏
  • 举报
回复
你上来就test(),这个时候还没加载完下面的部分。也就是test()函数内容还未被创建

87,994

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧