2015-01-31 58 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 2015-01-31 19:09:08

+0

[Javascript函數範圍和提升]的可能重複(http://stackoverflow.com/questions/7506844/javascript-function-scoping-and-hoisting) – 2015-01-31 19:16:44

回答

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

函數語句被提升高於變量定義no?全局上下文中的變量定義是如何在全局對象上創建屬性影響事物的呢? – Ben 2015-01-31 19:14:55

+0

JavaScript ......這是唯一一種語言,即使在這麼多年之後,仍然讓我想要自己死而復生,只要有這樣的事情之一就會出現。 – brezanac 2015-01-31 19:34:19

+0

@onesomeday - 請檢查小提琴http://jsfiddle.net/s8a7m1hk/1/,我們可以說這是最終的細分?如果不是最終的話,進一步分解如果是,我們可以推斷所有函數聲明都被分解到函數表達式中。請糾正我,如果我錯了 – 2015-01-31 20:15:35

0

該規範會告訴你精確的算法。下面,context是封閉的LexicalEnvironment[[Scope]],或全局對象。

這大致會發生什麼:

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.