gpt4 book ai didi

javascript - 代码块内定义的内部函数的语义是什么?

转载 作者:行者123 更新时间:2023-11-30 10:19:48 25 4
gpt4 key购买 nike

前提:函数文字仅在执行相应赋值时绑定(bind)到它们的名称(除非匿名使用)。例如,可以像这样进行条件定义:

var fn;
if (some condition) {
fn = function() {
// some code
};
} else {
fn = function() {
// some different code
};
}

内部函数,另一方面,表现得好像它们总是绑定(bind)到它们的名字,在各自的范围内,忽略任何代码路径注意事项:

function outer() {
inner();
return;

function inner() {
// some code
}
}

我的问题是,当内部函数定义在函数定义以外的代码块中时,它们的行为如何?以下应该是合法的吗?标准是否未定义它?

function outer() {
if (true) {
inner();

function inner() {
// some code
}
}
}

我用 this JSFiddle 进行的测试似乎表明它适用于大多数浏览器,包括 Chrome、Safari 和 IE 8-11,但不适用于 Firefox。这是 Firefox 中的错误吗?

最佳答案

他们不会 - 事实上有些浏览器会因该代码而失败,尤其是当您处于严格模式时。

函数执行时,分两步完成:

首先,找到所有 varfunction X 声明并将其提升到顶部。请注意,在 var x = 1 的情况下,只有 var x 部分被提升,将 x = 1 留在原来的位置。

然后代码运行。

所有 var 语句都会被提升,即使它们在 if block 中。例如:

function test() {
if( false) {
var x = 1;
}
alert(x); // you may expect ReferenceError, but in fact you get undefined
};

这样做是安全的,因为它只是在说“这个变量可能在某个时候存在”。

但是对于函数来说就很不一样了,因为函数的内容也被提升了。这可能会导致在条件中定义的函数出现重大问题,因此虽然一些浏览器会很乐意提升它们(将最后一个定义为最终定义),但其他浏览器会失败。

function test() {
if( true) {
function derp() {alert("True");}
}
else {
function derp() {alert("False");}
}
derp(); // an ignorant programmer may expect True,
// only to find they get False, or an error
}

我希望这是有道理的!

关于javascript - 代码块内定义的内部函数的语义是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21904875/

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