2013-07-06 25 views
5

Tôi cố gắng hiểu phạm vi biến đổi trong Javascript. Dưới đây là những gì tôi đang làm:javascript: bản địa hóa các biến trong khối

<script> 
for (var i = 0; i < 3; i++) { 
    document.getElementById(i).onclick = function() { 
    console.log(i); 
    } 
} 
</script> 

Kết quả luôn là 3 và tôi hiểu rằng đó là vì i đã được giữ lại theo tham chiếu. Làm cách nào để bản địa hóa i để có thể ghi nhật ký giá trị gia tăng?

Cảm ơn!

cập nhật

Thanks guys để được trả lời nhanh chóng và đàng hoàng. các giải pháp thực sự giúp đỡ!

Ban đầu, tôi đã cố gắng một cách tiếp cận tương tự như @GrailsGuy, ở đây nó là:

<script> 
for (var i = 1; i <= 3; i++) { 
    document.getElementById(i).onclick = function() { 
     console.log(logCall(i)); 
    } 
} 
function logCall(i) { 
    return i; 
} 
</script> 

Nhưng có vẻ như i không được địa phương. Không thể hiểu tại sao!

+0

Liệu nó có cái gì để làm với các sự kiện onclick? Làm thế nào nó có thể lặp qua onclick nếu người dùng chỉ bấm một lần? Và bạn có cần hàm logCall() không? Nó sẽ không giống như console.log (i)? – oobie11

+0

Về chỉnh sửa của bạn, đó là cùng một vấn đề như trong ví dụ đầu tiên của bạn. Cho dù bạn có 'console.log (i)' hoặc 'superlongandconfusingfunctionname (i)' bên trong trình xử lý sự kiện không tạo ra sự khác biệt. Bạn đang cố truy cập 'i' sau khi vòng lặp kết thúc. –

Trả lời

7

Tạo một phạm vi mới

for (var i = 0; i < 3; i++) { 
    (function(i) { 
    document.getElementById(i).onclick = function() { 
     console.log(i); 
    } 
    }(i)); 
} 
2

Trong Javascript, phạm vi không được tạo bởi dấu ngoặc vuông (trái với cú pháp giống C). Phạm vi là tuy nhiên, được tạo ra trong các chức năng, vì vậy một cách là để trích xuất các cuộc gọi vào một chức năng (cập nhật):

<script> 
for (var i = 0; i < 3; i++) { 
    logCall(i); 
} 

function logCall(i) { 
    document.getElementById(i).onclick = function() { 
     console.log(i); 
    } 
} 
</script> 

này có thêm lợi ích của việc mã một chút tái sử dụng nhiều hơn nữa.

+0

Tại sao lại là downvote? – Igor

+0

Tôi đã không downvote, nhưng mã của bạn không giải quyết bất cứ điều gì. – Prinzhorn

+1

Điều này không chính xác, http://jsfiddle.net/GaCPv/ – Musa

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