2016-06-22 2 views
0
function test(flag){ 
    if (flag) { 
     return function test1(){console.log(1)} 
    }else{ 
     return function test1(){console.log(2)} 
    } 
} 
test(true)() 
test()() 

это журнал 1 и 2, то почему бы не удваивать 2? как это работаетJavascript функция Подъемный не работает

мой английский не очень хорошо, спасибо

это также работает с 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()() 
+1

Это потому, что в первом флаге вызова передается как истинный и, следовательно, выполняется истинный блок, а во втором флаге вызова будет передан как неопределенный, и, таким образом, будет выполнен ошибочный блок. –

+0

При первом вызове 'флаг' true, затем выполняет условие 'if'. На втором флаге 'flag' является null, что является ложным, а затем выполняет условие' else'. – choz

+2

Не пишите такой код. –

ответ

0

В первом вызове test(true)() он проходит через:

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

потому что flag имеет значение true.

Во втором вызове test()() она проходит через else пути:

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

, потому что в этом значении экземпляра flag не определено и оно вычисляется как false.

Вы можете получить информацию о truthy и falsy, используя следующие ссылки.

Надеюсь, у вас есть идея здесь. Пожалуйста, дай мне знать, если возникнут какие-либо вопросы.

1

Функция в этой строке:

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

Не объявление функции. Это выражение с именем function, потому что оно является частью инструкции.

Выражения функций не поднимаются. Только объявления функций водрузили, как это:

function test(){ 
 
    return test1; 
 

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

 
test()();

Edit: Что касается вопроса, который вы добавили после факта, объявления функций внутри условных выражений имеют неопределенное поведение, и вы можете увидеть различные результаты в зависимости на вашем JavaScript-движке. Функции внутри операторов if-else не могут быть подняты в верхней части области видимости, и вы не должны помещать объявления функций в условные выражения. More about this

+0

'функциональный тест (флаг) { \t, если (флаг) { \t \t функции test1() {console.log (1)} \t \t возврата test1 \t} еще { \t \t функции test1() {консоли.войти (2)} \t \t возврата test1 \t} } тест (истина)() Test()() 'Это также 1 и 2 – user1861806

+0

' функцию тест (флаг) { , если (флаг) { функцию test1() {console.log (1)} возвращение test1 } еще { функция test1() {console.log (2)} возвращение test1 }} тест (истина)() тест() () ' – user1861806

+0

@ user1861806 Объявление функций внутри условных выражений имеет неопределенное поведение, и вы можете видеть разные результаты в зависимости от вас r JavaScript-движок. Подъем не гарантируется внутри выражения 'if-else', и вы не должны помещать функции внутри условных выражений. – JLRishe

Смежные вопросы