javascript函数提升不起作用

时间:2016-06-22 03:49:28

标签: javascript function hoisting

function test(flag){
    if (flag) {
        return function test1(){console.log(1)}
    }else{
        return function test1(){console.log(2)}
    }
}
test(true)()
test()()

它记录1和2,为什么不加倍2? 这是如何工作的

我的英语不是很好,谢谢

这也适用于1和2

function test(flag){
    if (flag) {
        function test1(){console.log(1)}
        return test1
    }else{
        function test1(){console.log(2)}
        return test1
    }
}
test(true)()
test()()

2 个答案:

答案 0 :(得分:1)

此行中的功能:

return function test1(){console.log(2)}

不是函数声明。它是命名函数表达式,因为它是语句的一部分。

不会悬挂功能表达式。只提升函数声明,如下所示:



function test(){
    return test1;

    function test1() { console.log(1); }
    function test1() { console.log(2); }
}

test()();




编辑:关于事后添加的问题,条件表达式中的函数声明具有未定义的行为,您可以根据JavaScript引擎看到不同的结果。 if-else语句中的函数可能不会被提升到作用域的顶部,也不应该将函数声明放在条件表达式中。 More about this

答案 1 :(得分:0)

在第一个电话test(true)()中,它会通过:

if (flag) {
        return function test1(){console.log(1)}
    } 

因为flag的值为true

在第二个电话test()()中,它会经过else路径:

else{
        return function test1(){console.log(2)}
    }

因为在该实例中flag的值未定义且评估为false

您可以使用这些链接了解truthyfalsy

希望你能在这里得到这个想法。如果您有任何问题,请与我们联系。