2015-08-16 25 views
6

Tôi mới dùng JS và có nghi ngờ với ví dụ bên dưới. Vui lòng xem các bình luận nội tuyến.Cách truy cập biến chức năng bên ngoài trong hàm bên trong lồng nhau trong JS

function outer() { 
 
\t var x = 5; 
 
\t console.log("outer",x); // Prints 5 
 
\t console.log("-----------"); 
 
\t function inner() { 
 
\t \t var x = 6; 
 
\t \t console.log("inner",x); // Prints 6 
 
\t \t console.log("outer",x); // Prints 6. How to print 5 
 
\t \t console.log("-----------"); 
 
\t \t function _inner() { 
 
\t \t \t var x = 7; 
 
\t \t \t console.log("_inner",x); // Prints 7 
 
\t \t \t console.log("inner",x); // Prints 7. How to print 6 
 
\t \t \t console.log("outer",x); // Prints 7. How to print 5 
 
\t \t \t console.log("-----------"); 
 
\t \t } 
 
\t \t _inner(); 
 
\t } 
 
\t inner(); 
 
} 
 
outer();

+2

vượt qua như tham số cho các chức năng bên trong với một cái tên khác Tôi cho rằng? –

+1

Nếu biến cục bộ được khai báo với tên giống với biến toàn cục hơn, thì (ngoại trừ trường hợp phạm vi toàn cục thực) không có cách nào để truy cập biến ngoài. – Pointy

+0

Có chủ ý là cả ba biến đều có cùng tên giống nhau không? Chỉ cần thay đổi tên của biến "inner" thành 'y' và biến" _inner "thành' z', bạn sẽ nhận được kết quả mong đợi. – Lix

Trả lời

5

Có thể điều này giúp bạn. Gán các biến của bạn để chức năng lồng nhau của bạn bởi vì do đó nó là rõ ràng những gì varible nên được sử dụng nhưng họ phải khác với nhau một cách nào đó (tên hoặc thông qua namespace):

function outer() { 
    var x = 5; 
    // or via namespace 
    // var out = { x : 5 }; 
    console.log("outer",x); // 5 
    console.log("-----------"); 
    function inner() { 
     inner.x = 6; 
     console.log("inner",inner.x); // 6 
     console.log("outer",x); // 5 
     console.log("-----------"); 
     function _inner() { 
      _inner.x = 7; 
      console.log("_inner",_inner.x); // 7 
      console.log("inner",inner.x); // 6 
      console.log("outer",x); // 5 
      // namespace 
      // console.log("outer",out.x); // 5 
      console.log("-----------"); 
     } 
     _inner(); 
    } 
    inner(); 
} 
outer(); 

Trong ví dụ này chỉ có hai trong ba varibles được assign (không ngoài x) vào các chức năng bởi vì nếu không bạn có thể đánh giá outer.x từ chức năng bên ngoài bên ngoài và gán nó bất kỳ giá trị:

function outer(){ 
    outer.x = 5; 
    ... 
} 
// assign any value outside outer function 
outer.x = 34; 

Nhưng khi một biến địa phương được xác định:

function outer(){ 
    var x = 23; 
} 

Sau đó, không có cơ hội để gán biến cục bộ này (x) bất kỳ giá trị nào từ hàm ngoài bên ngoài.

+0

là 'outer.x = 5;' có nghĩa là tạo ra tài sản nguyên mẫu? – Roy

+1

không. bạn phải sử dụng nguyên mẫu như: outer.prototype.x trong thời trang này tất cả các đối tượng có nguồn gốc của kiểu bên ngoài có quyền truy cập vào biến này vì vậy nó là một loại biến lớp. Viết outer.x cũng có thể và tất cả các đối tượng đều có quyền truy cập vào nó nhưng nó không được khuyến khích vì inheritage chỉ hoạt động trên nguyên mẫu đúng và bạn không phải viết tên hàm (bên ngoài) một lần nữa khi truy cập x biến ở đâu đó trong một phương thức đối tượng . Hy vọng rằng tôi đã viết không phức tạp :) – Blauharley

3

Javascript không theo mặc định có biến phạm vi bị chặn như nhiều ngôn ngữ lập trình. Điều này có nghĩa là biến x như bạn đã khai báo ở trên, là biến tương tự.

Tuyên bố biến, bất cứ nơi nào xảy ra, được xử lý trước khi bất kỳ mã nào được thực thi. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/var

Tôi khuyên bạn không nên sử dụng cùng tên biến trong hàm lồng nhau. Nó trở nên khó đọc và gỡ lỗi. Ngoài ra bạn có thực sự cần phải có chức năng lồng nhau không?

function outer() { 
    var x = 5; 
    console.log("outer",x); // Prints 5 
    console.log("-----------"); 
    inner(x); 
} 
function inner(x1) { 
    var x = 6; 
    console.log("inner",x); // Prints 6 
    console.log("outer",x1); // Prints 5 
    console.log("-----------"); 
    _inner(x,x1); 
} 
function _inner(x1, x2) { 
    var x = 7; 
    console.log("_inner",x); // Prints 7 
    console.log("inner",x1); // Prints 6. 
    console.log("outer",x2); // Prints 5. 
    console.log("-----------"); 
} 
outer(); 

Hoặc bạn có thể sử dụng đối tượng tuyên bố nó như vậy

function outer() { 
    var x = { 
     outer: 5 
    }; 
    console.log("outer",x,outer); // Prints 5 
    console.log("-----------"); 
    function inner() { 
     x.inner = 6; 
     console.log("inner",x.outer); // Prints 6 
     console.log("outer",x.inner); // Prints 6. How to print 5 
     console.log("-----------"); 
     function _inner() { 
      x._inner = 7; 
      console.log("_inner",x._inner); // Prints 7 
      console.log("inner",x.inner); // Prints 7. How to print 6 
      console.log("outer",x.outer); // Prints 7. How to print 5 
      console.log("-----------"); 
     } 
     _inner(); 
    } 
    inner(); 
} 
outer(); 
0

khi chúng ta tái sử dụng tên biến bên trong một phương pháp thì chỉ có khối phạm vi sẽ làm việc. có nghĩa là phạm vi sẽ hoạt động. Có nghĩa là cho các biến này, các dấu ngoặc {. . .} sẽ xác định phạm vi.

những gì bạn có thể thử là định nghĩa biến toàn cầu


             
  
var x = 5; 
 
    var innerx = 5; 
 
    var _innerx = 5; 
 
    function outer() { 
 
    } 
 
+0

** sử dụng tên khác nhau cho các biến ** chức năng outer() { var x = 5; chức năng bên trong() { \t \t var innerx = 6; hàm _inner() { \t \t \t var _innerx = 7; } } } ManishSingh

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