2016-07-31 3 views
0

Я изучаю контекст выполнения из Javascript. Но я не понимаю, почему «функция foo» не будет написана «var foo». Надеюсь, кто-то может это объяснить, благодарим вас за ответ.Выполнение контекста объявленное имя дважды?

функция асе() {

console.log(typeof foo); // function pointer 
console.log(typeof bar); // undefined 

var foo = 'hello', 
    bar = function() { 
     return 'world'; 
    }; 

function foo() { 
    return 'hello'; 
} 
var foo = 'hello'; 

}

асе();

+0

'Foo' переписывается – guest271314

ответ

0

Почему «функция foo» не будет написана «var foo».

foo переписывается на линии, где foo повторно определен

function ace() { 
 

 
    console.log(typeof foo); // function pointer 
 
    console.log(typeof bar); // undefined 
 

 
    var foo = 'hello', 
 
    bar = function() { 
 
     return 'world'; 
 
    }; 
 

 
    function foo() { 
 
    return 'hello'; 
 
    } 
 
    var foo = 'hello'; 
 
    console.log(foo); 
 
    try { 
 
    foo() 
 
    } catch(e) { 
 
    console.log("catch:", e.message) 
 
    } 
 
} 
 

 
ace();

0

Но я не понимаю, почему функция «Foo» не будет более, написанные "var foo".

Объявление var не перезаписывает объявление функции. Оба объявляют одну и ту же переменную, и из-за объявления функции она инициализируется функцией. Только присваивание перепишет значение.

Если взять грузоподъемных во внимание, ваш сценарий будет вести себя как

function ace() { 
    var foo, bar; 
    var foo = function() { 
     return 'hello'; 
    } 
    var foo; 

    console.log(typeof foo); // function 
    console.log(typeof bar); // undefined 

    foo = 'hello'; 
    bar = function() { 
     return 'world'; 
    }; 
    console.log(typeof foo); // string 
    foo = 'hello'; 
} 
ace(); 
+0

Благодарим Вас за RESPONS. Но являются ли функции, не созданные на объекте активации перед переменными? Но почему имя «function foo» будет перезаписано «var foo»? Мне жаль, я пытаюсь это понять – Overste

+0

@Overste: Функция не является специальным типом переменной. Объявление функции просто объявляет переменную и инициализирует ее с помощью объекта функции. Объявление переменной просто объявляет одну и ту же переменную, и, если она уже не существует, инициализирует ее с помощью 'undefined'. 'function foo' * не * перезаписывается' var foo' - 'foo' перезаписывается' foo = ... '. – Bergi

+0

Благодарим вас за отзыв. Думаю, я получил его благодаря вам. Но у меня последний вопрос: я прочитал статью, которую он сказал: Несмотря на то, что foo объявляется дважды, мы знаем со стадии создания, что функции создаются в памяти перед переменными. это не так: var foo = function() { return 'hello'; } и чем var foo, bar; – Overste