gpt4 book ai didi

javascript - 无法访问的条件 block 中的函数声明

转载 作者:行者123 更新时间:2023-11-28 11:16:35 27 4
gpt4 key购买 nike

非常有趣。你为什么这么认为?

var fn1 = function() {
function fn2() {
return "fn2 initialize...."
}

if (false) {
function fn2() {
return "fn2 if --> false"
}
}
return fn2();
}

fn1(); // "fn2 if --> false"

或更有趣;

var fn1 = function() {
function fn2() {
return "fn2 initialize...."
}

if (false) {
function fn2() {
return "fn2 if --> false"
}
}
return fn2();

function fn2() {
return "fn2 return after"
}
}

fn1(); // "fn2 return after"

最佳答案

该代码中发生了两件事,其中之一是指定的行为,另一件事在语法上无效(目前),其结果将因 JavaScript 引擎而异。

无效的一点是条件 block 中不能有函数声明。例如,该位无效:

if (false) {
function fn2() {
return "fn2 if --> false"
}
}

某些引擎会将其视为函数声明,这意味着它不受分步代码流程的影响(因为函数声明不是,它们发生在分步代码之前 -步骤流程)。

其他引擎(实际上)会为您将其重写为函数表达式,并将其放入分步流程中。

我相信 ECMAScript6 将解决这个问题。

指定的位与同一范围内只有两个声明有关,例如:

var fn1 = function() {
function fn2() {
return "the first fn2"
}

return fn2();

function fn2() {
return "the second fn2"
}
};
fn1(); // "the second fn2"

规范明确指出,作用域内的所有函数声明都按照源代码的顺序进行处理,因此上面的内容(删除了无效位)可靠地使用了第二个 fn2,不是第一个。

关于javascript - 无法访问的条件 block 中的函数声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20676471/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com