2012-02-14 16 views
7

Tôi hiện đang đọc một cuốn sách trên Javascript bởi Pragmatic, và tôi đang bối rối về một điều. Họ có một phần về cách tạo các biến toàn cục, cục bộ hoặc riêng tư.Chức năng Toàn cầu và Địa phương và Riêng tư (Javascript)

  1. Sự khác biệt giữa biến cục bộ và riêng tư là gì? Có cái nào không?

  2. Làm thế nào để tạo ra một biến toàn cầu hoặc cục bộ, Họ đã nói điều gì đó về việc đặt 'var =' trước nó, nhưng nó rất mơ hồ.

+0

Bạn có thể muốn xem http://stackoverflow.com/questions/500431/javascript-variable-scope –

Trả lời

8
  1. Không, dân sử dụng "tư nhân" vì họ là những nhầm lẫn và có nghĩa là để nói "địa phương"

  2. biến cục bộ được định nghĩa là

var foo = "local";

biến toàn cục là thuộc tính của đối tượng phạm vi toàn cục (là window trong trình duyệt)

window.foo = "global";

Thực tế bạn có thể làm foo = "global"; mà không chỉ định foo biến với var foo là một "lỗi". Điều này được sửa trong chế độ nghiêm ngặt của ES5.

(function() { "use strict"; foo = 42; })()

cho ReferenceError: foo is not defined

Lưu ý rằng bạn có thể làm cho các biến toàn cục bằng cách tuyên bố họ ở bên ngoài phạm vi nhất

var foo = "global"; 
function bar() { 
    var foo = "local"; 
} 

Cần lưu ý rằng bạn không nên có bất kỳ mã trong ngoài phạm vi nhất, bao giờ hết. Bạn nên gói tất cả phạm vi của bạn trong các hàm ẩn danh để bạn nhận được "phạm vi cấp mô-đun". Điều này có nghĩa là bạn có phạm vi cấp cao nhất dựa trên mỗi tệp. Đây là một phần của mô-đun mô-đun.

4

Trong ngữ cảnh của trình duyệt, từ khóa var sẽ biến số đó thành biến của hàm hiện tại.

var a = 10; 

var b = function(a) { 
    console.log(a); # 15 
} 

b(15); 
console.log(a); # 10 

Nếu bạn không bao gồm từ khóa var, nó được gán phạm vi cửa sổ và được xem là toàn cầu. Trừ khi bạn có một lý do rất tốt để loại trừ nó, luôn bao gồm từ khóa var.

Biến được coi là riêng tư nếu chỉ tồn tại trong phạm vi chức năng. Điều này thường có dạng của một hàm ẩn danh. Đây không phải là một biến riêng tư theo nghĩa thông thường của thuật ngữ, nó chỉ đơn giản là một biến cục bộ.

(function() { 
    var x = 10; 
})(); 

console.log(x); #undefined 
+0

Định nghĩa riêng tư của bạn kém. Các biến không bao giờ là riêng tư. – Raynos

+1

@Raynos 'Đây không phải là biến riêng tư theo nghĩa thông thường của thuật ngữ, nó chỉ đơn giản là biến cục bộ.' – Gazler

+0

..hoặc sử dụng CoffeeScript :-) –

0

Sự khác biệt giữa biến cục bộ và riêng tư là gì? Có không?

Phụ thuộc vào ngữ cảnh nào chúng được sử dụng. Nói chung chúng có ý nghĩa tương tự. Từ quan điểm OOP, một biến cục bộ thường được gọi là private.

Làm sao người ta làm cho một biến toàn cầu hay địa phương, Họ nói một cái gì đó về việc đưa 'var =' trước đó, nhưng nó đã rất mơ hồ.

Khi bạn đặt var trước biến, biến trở thành biến cục bộ, trong trường hợp vắng mặt, nó sẽ trở thành biến toàn cục. Ví dụ:

var foo = 1; // local 
foo = 1; // global equivalent to window.foo = 1 becomes part of window object 

Nhiều thực tiễn Ví dụ:

function myfunc(){ 
    var foo = 1; // presence of var keyword 
    bar = 2;  // absence of var keyword 
} 

alert(foo); // error eg undefined 
alert(bar); // 2 because bar is part of window global object 
0

Javascript có một phạm vi chức năng, bất kỳ biến được định nghĩa trong một hàm với một từ khóa var là địa phương để các chức năng và không nhìn thấy được bên ngoài. các biến được định nghĩa trong hàm không có từ khóa var là các hình cầu và được hiển thị ở mọi nơi.

function test(){ 
    var local = 'local'; // this is local 
    global = 'global'; // this is global 
} 

test(); // call a function 

alert(local) // undefined 
alert(global) // global 
+0

'cảnh báo (cục bộ);' ném Tham chiếuError – Raynos

0

Biến riêng tư chỉ có ý nghĩa khi bạn đang xây dựng các đối tượng. Mẫu nguyên mẫu điển hình cho phép bạn thêm bất kỳ biến và hàm trợ giúp cần thiết nào làm thuộc tính của đối tượng và/hoặc mẫu thử của nó, nhưng điều này có bất lợi khi khiến chúng hiển thị với bất kỳ ai có quyền truy cập đối tượng. Để tránh điều này, có một mẫu thay thế trong đó các biến là các biến cục bộ của hàm tạo và tất cả các phương thức được khai báo trong phạm vi hàm tạo và chỉ các phương thức công khai được gán làm thuộc tính thực tế của đối tượng.