2012-07-09 32 views
7

Đối với đoạn này, tôi không ngạc nhiên khi biến toàn cầu 'a' đánh giá là 5.Bối rối bởi JavaScript đoạn mã này

http://jsfiddle.net/MeiJsVa23/gZSxY/:

var a = 10; 

function func(){ 
    a = 5; 
} 

func(); // expect global variable 'a' to be modified to 5; 

alert(a); // and this prints out 5 as expected. No surprise here. 
​ 

Nhưng làm thế nào mà cho đoạn mã này, toàn cầu biến 'a' ước tính là 10 và không phải là 5? Nó như thể a = 5 chưa bao giờ xảy ra.

http://jsfiddle.net/MeiJsVa23/2WZ7w/:

var a = 10; 

function func(){ 
    a = 5; 
    var a = 23; 
} 

func(); // expect global variable 'a' to be modified to 5; 

alert(a); // but this prints out 10!! why? 

+0

Ồ, tôi nghĩ câu hỏi của bạn đã được trả lời;) – mplungjan

Trả lời

0

var a trong chức năng được đưa lên đầu phạm vi chức năng, do đó, biến cục bộ sẽ được sửa đổi, chứ không phải biến cục bộ.

0

Điều này phải làm với cẩu.

Trong hàm, biến cục bộ có cùng tên được khai báo. Mặc dù nó xảy ra sau khi sửa đổi của bạn, nó được coi là đã được tuyên bố trước khi nó - điều này được gọi là cẩu.

Biến cục bộ để khai báo nhưng không phải giá trị. Vì vậy:

function someFunc() { 
    alert(localVar); //undefined 
    var localVar = 5; 
} 

Chức năng, nếu được tuyên bố với cú pháp function name() {..., cho cả kê khai và giá trị.

function someFunc() { 
    alert(someInnerFunc()); //5 
    function someInnerFunc() { return 5; } 
} 
0
var a = 10; //a is 10 

function func(){ 
    a = 5; //a is 5 
    var a = 23; // a is now in local scope (via hoisting) and is 23 
} 

func(); 

alert(a); // prints global a = 10 
1

này được gọi là "variable hoisting". var khai báo (và function() khai báo) được chuyển lên đầu phạm vi của chúng.

0

Có lẽ, tuyên bố var a = 23 tạo biến cục bộ cho toàn bộ phạm vi. Vì vậy, toàn cầu a bị che khuất toàn bộ func(), không chỉ cho các dòng bên dưới tuyên bố. Vì vậy, trong đoạn mã thứ hai của bạn, a = 5 được gán cho biến cục bộ được khai báo bên dưới.

2

Vì vậy, có hai điều sẽ xảy ra ở đây: hoistingshadowing.

Bởi vì là người đầu tiên, khai báo biến được "treo" lên hàng đầu, do đó, mã của bạn là tương đương với:

var a = 10; 

function func(){ 
    var a; 
    a = 5; 
    a = 23; 
} 

Và bởi vì điều thứ hai, bạn đang "shadowed" biến toàn cầu a với một địa phương, vì vậy những thay đổi không được phản ánh cho toàn cầu a.

+0

+1 cho ví dụ và làm phiền để giải thích những gì có nghĩa là cẩu. –

Các vấn đề liên quan