2015-11-22 20 views
14

Tôi có một chút hiểu biết về phạm vi JavaScript - rằng ngôn ngữ có phạm vi cấp chức năng và các khai báo biến và chức năng được đưa lên đầu phạm vi chứa của chúng. Tuy nhiên, tôi không thể tìm ra lý do tại sao hai mảnh sau mã đăng nhập giá trị khác nhau:Lẫn lộn với phạm vi JavaScript

này ghi lại giá trị từ 1 tới giao diện điều khiển:

var a = 1; 
function b() { 
    a = 10; 
    return; 
    function a() {} 
} 
b(); 
console.log(a); 

Và một cách bí ẩn, điều này ghi 10:

var a = 1; 
function b() { 
    a = 10; 
    return;   
} 
b(); 
console.log(a); 

Vì vậy, những gì đang xảy ra bên dưới mui xe?

+3

['sử dụng nghiêm ngặt'] (http://stackoverflow.com/questions/1335851/) sẽ không cho phép khai báo một hàm như trong ví dụ đầu tiên, do đó, đó có thể là một ý tưởng rất tồi để bắt đầu. – transistor09

+0

Thú vị nhưng nó giống như một vấn đề thiết kế. –

Trả lời

13

tôi thấy ví dụ đầu tiên bí ẩn hơn ...

Trong ví dụ thứ hai, bạn không khai báo một biến a bên trong của hàm. Vì vậy, khi bạn chỉ định cho a, nó sẽ nhắm mục tiêu a ở bên ngoài. Khá thẳng về phía trước.

Trong ví dụ đầu tiên, bạn khai báo biến a bên trong hàm, nhưng theo cách khác thường: Bằng cách khai báo hàm có tên a. Vì vậy, chỉ định cho a sẽ sử dụng "biến" cục bộ đó.

Hai điều để lấy đi ở đây:

a) Biến và chức năng khai báo được "treo" lên đỉnh phạm vi của chúng. Trong khi function a(){} được viết gần cuối, biến a để giữ nó đã được tạo và hiển thị ở đầu phạm vi.

b) Các hàm cũng có thể được sử dụng làm biến. Bạn có thể chuyển các hàm xung quanh, bạn có thể gán lại các định nghĩa hàm. Chúng chia sẻ cùng một không gian tên với các biến khác.

1

Bạn có thể sử dụng Visual Studio để mã hóa:

enter image description here

trình mã trong một nguyên cảo-File sẽ cho phép bạn xem các loại biến bằng cách di biến.

enter image description here

Nó cũng sẽ cảnh báo bạn, khi bạn cố gắng áp dụng các số có giá trị từ 10 đến biến "a", mà lần đầu tiên được công bố là một chức năng. Đó là những gì tôi thích về nguyên cảo, bạn có thể nhận được thông tin thêm về nó ở đây: http://www.typescriptlang.org/

+0

Có thông báo cảnh báo để đi với đường màu đỏ dưới sự phân bổ biến không? – Thilo

+2

đã in hình ảnh cho bạn – CupawnTae

+0

Cảm ơn bạn @CupawnTae – CoderPi

1

của nó bởi vì khi bạn sử dụng một tuyên bố function nó được treo lên và trở thành một biểu hiện chức năng, tức là var a = function() {}; này đang tạo ra một cuộc đụng độ với bạn a biến.

0

JavaScript là trình thông dịch. Javascript {block} không có phạm vi nhưng chức năng có.

Trong ví dụ của bạn,

var a = 1; 
function b() { 
    a = 10; 
    return; 
    function a() {} 
} 
b(); 
console.log(a); 

đầu tiên, bạn gán a là số nguyên 10, nhưng cuối cùng bạn phân công lại a của bạn như là một chức năng đó sẽ biến mất vào cuối phạm vi.

Trong mã này,

var a = 1; 
function b() { 
    a = 10; 
    return; 
    function foo() {} 
} 
b(); 
console.log(a); 

bạn a không thay thế, và trở về phạm vi toàn cầu, nó sẽ đăng nhập 10.