gpt4 book ai didi

javascript - switch 中的函数声明 - 为什么只保留最后一个定义?

转载 作者:行者123 更新时间:2023-11-29 16:44:33 26 4
gpt4 key购买 nike

我尝试使用开关来实现一个功能,因为我想根据情况以不同的方式实现它。简单来说,如下所示:

function test() { console.log('hello world'); };
someVar = 'foo';
switch (someVar) {
case 'foo':
console.info('foo');
function test() { console.log('foo'); };
break;
case 'bar':
console.info('bar');
function test() { console.log('bar'); };
break;
default:
console.info('default');
function test() { console.log('default'); };
}

test();

现在,控制台显示'foo',但是如果你看一下test的源代码,它将是function test() { console.log('默认'); }。但这不是作用域问题,因为开关没有自己的作用域,而且函数的第一个声明位于开关之前。

但是,如果将 test 声明为 var 并在这种情况下进行初始化,则结果将是所需的。

但是为什么总是最后一个函数声明的实现,与实际执行的情况无关?

最佳答案

基本上所有命名函数都会被提升,最后一个函数会覆盖第一个同名函数。

结果是这样的

function test() { console.log('hello world'); };
function test() { console.log('foo'); };
function test() { console.log('bar'); };
function test() { console.log('default'); }; // this is the last one and in use

someVar = 'foo';
switch (someVar) {
case 'foo':
console.info('foo');
break;
case 'bar':
console.info('bar');
break;
default:
console.info('default');
}
}

对于在 switch 上更改的函数,您可以根据需要对函数表达式的变量进行赋值。

function test() { console.log('hello world'); };
var test;

someVar = 'foo';
switch (someVar) {
case 'foo':
test = function () { console.log('foo'); };
console.info('foo');
break;
case 'bar':
test = function () { console.log('bar'); };
console.info('bar');
break;
default:
test = function () { console.log('default'); };
console.info('default');
}
}

关于javascript - switch 中的函数声明 - 为什么只保留最后一个定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42434297/

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