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

Javascript 开关中的函数声明-为什么只保留最后一个定义?,javascript,function,switch-statement,Javascript,Function,Switch Statement,我尝试使用开关实现一个函数,因为我想根据具体情况以不同的方式实现它。简单来说,它是这样的: function test(){console.log('hello world');}; someVar='foo'; 开关(someVar){ 案例“foo”: 控制台信息(“foo”); 函数测试(){console.log('foo');}; 打破 “酒吧”一案: 控制台信息('bar'); 函数测试(){console.log('bar');}; 打破 违约: console.info('de

我尝试使用开关实现一个函数,因为我想根据具体情况以不同的方式实现它。简单来说,它是这样的:

function test(){console.log('hello world');};
someVar='foo';
开关(someVar){
案例“foo”:
控制台信息(“foo”);
函数测试(){console.log('foo');};
打破
“酒吧”一案:
控制台信息('bar');
函数测试(){console.log('bar');};
打破
违约:
console.info('default');
函数测试(){console.log('default');};
}

test()基本上所有命名的函数都被提升,最后一个函数用相同的名称覆盖第一个函数

结果是

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');
    }
}
对于在开关上更改的函数,您可以根据需要对函数表达式的变量进行赋值

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');
    }
}
函数x(){}
声明被挂起;在实际代码运行之前对它们进行评估。您需要为变量指定一个函数表达式来实现这一点:

var test = function () { ... };

switch (...) {
    case ...:
        test = function () { ... };
        break;
    ...
}

这将按预期运行,因为它在运行时评估并明确重新分配名称
test

可能的重复副本并不能真正解释“多次提升”,因此可能无法完全回答问题。同意。那么,我们是否应该在那里发布解释得很好的答案,因为该帖子将被索引得更高,而且由于它的旧帖子,它将有更多的讨论,最终提供更多的信息?我决不会阻止重复数据消除,但我们不必将所有内容与所有内容合并……:)