2012-07-20 38 views
5

Với đoạn mã sau, những gì tôi nên mong đợi để nhìn thấy trong cảnh báo?Phạm vi chức năng ẩn danh thông qua như là chức năng lập luận

var a = 100; 
function afunc(infunc){ 
    a = 10; 
    infunc.call(); 
} 

afunc(function(){alert(a)}); 

Suy nghĩ ban đầu của tôi là trình duyệt của tôi phải cảnh báo 100 vì biến a = 100 nằm trong phạm vi cho chức năng ẩn danh được chuyển làm đối số. Nhưng điều này giả định rằng hàm ẩn danh thực sự được định nghĩa trong ngữ cảnh chung. Rõ ràng đó không phải là trường hợp như trình duyệt cảnh báo 10. Vậy tại sao một = 10 trước một = 100 trong chuỗi phạm vi?

Cảm ơn!

Trả lời

6

Bởi vì bạn đang thiết lập một đến 10 trước khi bạn gọi hàm nặc danh. a là trên thực tế toàn cầu, nhưng bạn đang đặt nó thành 10.

+3

Facepalm! Bây giờ tôi cảm thấy ngớ ngẩn. –

+0

có, đó là lý do chính xác –

6

Vậy tại sao = = 100 = 100 trong chuỗi phạm vi?

Nó không phải. Bạn đã chỉ định 1 a biến, mà chỉ đơn giản là được thay đổi 100-10 trước khi được cảnh báo.

Nếu bạn muốn a s là biến rõ rệt với các giá trị riêng của họ, cả hai đều cần một từ khóa var:

var a = 100 
function afunc(infunc){ 
    var a = 10; 
    infunc.call(); 
} 

afunc(function(){alert(a)})​ 
1

Hãy xem xét ví dụ sau:

var a = 100; 

function afunc(infunc){ 
    a = 10; 
    var f = function(){ 
    console.log(a); 
    }; 
    f.call(); 
    infunc.call(); 
} 

afunc(function(){ console.log(a); }); 

Chúng ta gán một giá trị của 10-a trong phạm vi afunc, và sau đó gọi hai chức năng một sau khi khác mà chỉ cần đăng nhập giá trị của a. Trong trường hợp này, bạn sẽ mong đợi cả hai hàm đăng nhập 10 là giá trị a và thực tế điều đó xảy ra.

Trong ví dụ của bạn, infunc sẽ được thực thi về cơ bản cùng phạm vi với bất kỳ hàm cục bộ nào được xác định trong afunc, bất kể vị trí thực sự được xác định. Vì bạn đã gán một giá trị cho a trong phạm vi hẹp hơn, đó là giá trị của a khi bạn gọi infunc.

Chức năng làm giữ lại một số phạm vi từ định nghĩa của họ, như trong ví dụ sau:

function bfunc(){ 
    var b = 'hello'; 
    return function(){ console.log(b); }; 
} 

afunc(bfunc()); 

Ở đây, chức năng ẩn danh trả về bởi bfunc là thực sự gọi từ trong phạm vi afunc, nhưng nó vẫn có thể để ghi lại giá trị chính xác của b vì nó được gán trong phạm vi ban đầu. Nếu bạn thay đổi afunc để gán một giá trị khác cho b, nó vẫn sẽ ghi lại "hello" vì số b được xác định trong afunc là một biến khác với b được xác định trong bfunc.

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