2012-03-08 26 views
6

Các biến được định nghĩa bên trong hàm bên trong có cùng tên như một biến trong hàm ngoài được phân lập từ biến ngoài không?Đóng cửa JavaScript và đặt tên là clobbering

function() { 
    var myTest = "hi there"; 
    (function(myTest) { 
     myTest = "goodbye!"; 
    })(); 
    console.log(myTest); // myTest should still be "hi there" here, correct? 
} 

Đương nhiên nếu tôi không tuyên bốmyTest bên trong hàm bên trong nó sẽ tạo ra một đóng và sửa đổi bản gốc. Tôi chỉ muốn đảm bảo rằng các biến được khai báo bên trong một hàm bên trong luôn được tách biệt với hàm đó ngay cả khi tên của chúng có thể xung đột với một phạm vi bên ngoài.

Trả lời

11

Có, chúng có hiệu quả. Mỗi hàm tạo một phạm vi mới và phạm vi gần nhất trong đó biến được yêu cầu được khai báo luôn được ưu tiên. Không có ngoại lệ. *


* gián tiếp eval

+0

Bằng cách "sử dụng" Tôi giả sử bạn có nghĩa là "tuyên bố" có đúng không? – devios1

+0

@chaiguy: Có, xin lỗi. Trộn lẫn từ của tôi có một chút. – Ryan

+0

phương pháp này cũng tránh tra cứu phạm vi. –

1

Chỉ vì lợi ích của sự hoàn chỉnh. Trong những rất giống ví dụ, đây là những gì xảy ra với không có tham số

var x = 'a'; 
(function() { //note that there is no parameter here 
    x = 'b'; 
    alert('inner:'+x); //b 
})(); 
alert('outer:'+x); //b 

và var với cùng tên

var x = 'a'; 
(function() { 
    var x = 'b'; 
    alert('inner:'+x); //b 
})(); 
alert('outer:'+x); //a