2015-01-31 3 views
0
var myName = 4; 

function myName() { 
    console.log("xxxx"); 
} 
console.log(typeof myName); //Number 

var myNamex; 

function myNamex() { 
    console.log("xxxx"); 
} 
console.log(typeof myNamex); //function 

Пожалуйста, обратитесь скрипку - http://jsfiddle.net/s8a7m1hk/Javascript - Как все сломано?

console.log(typeof myName); 

Вышеприведенные журналы заявление журнала другое значение, единственное отличие состоит в том, что переменной присваивается значение в одном месте, а не в другом.

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

+0

'var' заявление только связывает имя с EnvironmentRecord, он не присваивает' undefined' или любое другое значение для него. – raina77ow

+0

Возможный дубликат [Javascript function scoping and hoisting] (http://stackoverflow.com/questions/7506844/javascript-function-scoping-and-hoisting) –

ответ

3

Ваша проблема очень проста, как только у вас есть подъем в правильном порядке. Эффективно ваш код выглядит следующим образом:

function myName() { 
    console.log("xxxx"); 
} 

function myNamex() { 
    console.log("xxxx"); 
} 

var myName; 
var myNamex; 

myName= 4; 

console.log(typeof myName); //Number 

console.log(typeof myNamex); //function 

Все заявления (var заявления и декларации функции) поднимаются к вершине. Назначение значения 4 не поднимается, поэтому происходит после деклараций, поэтому myName - 4, когда он зарегистрирован. Вы никогда не назначаете какое-либо другое значение myNamex, поэтому оно не изменяется и по-прежнему является функцией.

+1

Операторы функций подняты выше, чем определения переменных нет? Как тот факт, что определения переменных в глобальном контексте создают свойства глобального объекта, влияют на вещи? – Ben

+0

JavaScript ... Единственный язык, который даже после стольких лет все еще заставляет меня хотеть побеждать себя до смерти, когда появляется одна из таких вещей, как подъем. – brezanac

+0

@onesomeday - Пожалуйста, проверьте скрипку http://jsfiddle.net/s8a7m1hk/1/, можем ли мы сказать, что это окончательный сбой? если не окончательный, дальнейшая разбивка? Если да, мы можем заключить, что все объявления функций разбиты на функциональные выражения. Пожалуйста, поправьте меня, если я ошибаюсь –

0

Спектр скажет вам точный алгоритм. Ниже, context - [[Scope]] прилагаемого LexicalEnvironment или глобального объекта.

Это примерно то, что происходит:

context.myName = function myName() { ... }; // From evaluating 1st function statement. 
context.myNamex = function myNamex() { ... }; // From evaluating 2nd function statement. 

context.myName; // From evaluating var declaration statement myName. Does nothing because property already exists. 
context.myNamex; // From evaluating var declaration statement myNamex. Does nothing because property already exists. 

context.myName = 4; // Changes the existing property to point to the number instead of the function myName. 

console.log(typeof myName); // Number - for reasons that should now be clear. 
console.log(typeof myNamex); // function - for reasons that should now be clear. 
Смежные вопросы