2010-12-30 43 views
9
(function() { 
    var x = 1; 
    return { 
     f: function (x) { 
      alert(x); 
     } 
    }; 
}()).f(2); 

Giả sử tôi không muốn đổi tên biến số. Không có cách nào để, từ trong số f, truy cập vào biến x, được khai báo đầu tiên - phải không?Truy cập biến trong phạm vi bên ngoài?

+1

bạn có thể phơi bày các biến với một phương pháp – hunter

+1

Tại sao bạn không muốn đổi tên biến số? – strager

+1

Tham số 'x' * shadows * biến' x'. Giống như trong nhiều ngôn ngữ lập trình khác (đôi khi có thể được giải quyết nhưng trong ví dụ này, không). –

Trả lời

11

đúng. Vì bạn có x khác trong function (x), mọi nỗ lực truy cập x sẽ nhận được mã đó (phạm vi gần nhất). Nó chặn truy cập vào bất kỳ x nào trong phạm vi rộng hơn.

1

Bạn có thể trả lại biến với các chức năng:

(function() { 
    var x = 1; 
    return { 
     f: function() { 
      alert(this.x); 
     }, 
     x:x 
    }; 
}()).f(); 
1

Không có cách nào để, từ bên trong f, truy cập vào biến x, được công bố đầu tiên

Không, không có. Phạm vi bên trong x ẩn phạm vi bên ngoài x.

var closure = (function() { 
    var local = {}; 
    local.x = 1; 
    return { 
     f: function (x) { 
      alert(x || local.x); 
     } 
    }; 
}()); 

closure.f(2); // alerts "2" 
closure.f(); // alerts "1" 

Bạn không thể có biến bên trong được gọi là "cục bộ", tất nhiên. ;-)

4

Điều này cho phép bạn sử dụng cả x (1) và x (2) cùng một lúc.

(function() { 
    var x = 1; 
    return { 
     f: function (x) { 
      alert(x); // paramter (=2) 
      alert(this.x); // scoped variable (=1) 
     }, 
     x:x 
    }; 
}()).f(2); 
+0

Một cách tiếp cận thú vị. Cảm ơn! Mặc dù, trong trường hợp thực tế, tôi không muốn để lộ rằng 'x'. – feklee

0

Aware các cuộc gọi async ngầm mà làm cho bạn nghĩ rằng bạn không thể truy cập các biến từ phạm vi bên ngoài:

result = {} 
jQuery.ajax({ // it is a async call! 
    url: "/some/url", 
    success: function(data) { 
     result = JSON.parse(data); 
    } 
}); 

return result; // Result will be still {} because function returns before request has done. 
Các vấn đề liên quan