2012-03-26 45 views
6

Tôi đang cố gắng hiểu các biến CoffeeScript được sắp xếp như thế nào. Theo tài liệu:Lẫn lộn về phạm vi biến CoffeeScript

Hành vi này có hiệu quả giống với phạm vi của Ruby đối với các biến địa phương .

Tuy nhiên, tôi phát hiện ra rằng nó hoạt động khác nhau.

Trong CoffeeScript

a = 1 
changeValue = -> a = 3 
changeValue() 
console.log "a: #{a}" #This displays 3 

Trong Ruby

a = 1 
def f 
    a = 3 
end 
puts a #This displays 1 

ai đó có thể giải thích nó, xin vui lòng?

Trả lời

8

Biến cục bộ của Ruby (bắt đầu bằng [a-z_]) are really local to the block they are declared in. Vì vậy, hành vi Ruby bạn đăng là bình thường.

Trong ví dụ Coffee của bạn, bạn có một tham chiếu closure a. Nó không phải là một tuyên bố chức năng.

Trong ví dụ Ruby của bạn, bạn không có đóng cửa mà là khai báo hàm. Cái này khác. Ruby tương đương với Cà phê của bạn là:

a = 1 
changeValue = lambda do 
    a = 3 
end 
changeValue() 

Trong các bao đóng, biến cục bộ có thể truy cập khi khối được thực thi. Đây là (một trong những) quyền hạn đóng cửa!

+0

Bây giờ tôi hiểu. Cảm ơn. –

0

Biến số đang sử dụng bên trong hàm changeValue là biến số a toàn cầu. Đó CoffeeScript sẽ được biên dịch thành mã JavaScript sau:

var a, changeValue; 
a = 1; 
changeValue = function() { 
    return a = 3; 
}; 
changeValue(); 
console.log("a: " + a); 

Để changeValue để không làm thay đổi biến a (tức là sử dụng một biến địa phương), bạn sẽ hoặc là cần phải có một cuộc tranh cãi với hàm có tên a (mà sẽ tạo một biến cục bộ cho hàm đó) hoặc khai báo a dưới dạng biến cục bộ bên trong hàm bằng cách sử dụng var a = 3; (không chắc chắn CoffeeScript là gì, tôi không phải là một CoffeeScript).

Some examples of JavaScript variable scope.

+1

Tôi hiểu trường hợp JavaScript. Nhưng trong CoffeeScript, tôi nghĩ biến cục bộ phải luôn luôn đổ bóng biến toàn cầu vì khi tôi định nghĩa một hàm, tôi không thể xem xét tất cả các biến toàn cục. –