2010-06-11 39 views
13
for (var i = 0; i < somearray.length; i++) 
{ 
    myclass.foo({'arg1':somearray[i][0]}, function() 
    { 
     console.log(somearray[i][0]); 
    }); 
} 

Làm thế nào để vượt qua somearray hoặc một trong các chỉ mục của nó vào chức năng ẩn danh? somearray đã nằm trong phạm vi toàn cầu, nhưng tôi vẫn nhận được somearray [i] không được xác địnhĐối số cho JavaScript Chức năng ẩn danh

+0

đây là một vấn đề thường gặp - xem tất cả các câu hỏi liên quan http: // stackoverflow. com/questions/tagged/javascript + closures + loop – Anurag

Trả lời

29

Các i trong hàm ẩn danh nắm bắt được biếni, không giá trịcủa nó. Đến cuối vòng lặp, i bằng somearray.length, vì vậy khi bạn gọi hàm, nó cố truy cập mảng phần tử không tồn tại.

Bạn có thể khắc phục điều này bằng cách tạo ra một hàm hàm xây dựng để chụp giá trị của biến:

luận
function makeFunc(j) { return function() { console.log(somearray[j][0]); } } 

for (var i = 0; i < somearray.length; i++) 
{ 
    myclass.foo({'arg1':somearray[i][0]}, makeFunc(i)); 
} 

makeFunc 's có thể đã được đặt tên i, nhưng tôi gọi nó là j để chứng minh rằng đó là một biến khác nhau so với cái được sử dụng trong vòng lặp.

+0

+1 để có giải thích tốt về vấn đề này, cũng như cung cấp giải pháp! – Matt

+0

Tôi nhận được quan điểm của bạn. Cảm ơn. Nhưng tôi không thể tìm ra cách gọi makeFunc. – Phonethics

+0

Tuyệt vời! Tôi đã giải quyết được vấn đề của mình. Đây là một điều hoàn toàn mới đối với tôi trong JavaScript! – Phonethics

-2

Tất cả các chức năng/phương pháp chỉ có thể được sử dụng làm gọi lại. Khi bạn gọi hàm gọi lại, bạn chuyển các biến cho nó.

var myclass = { 
    foo: function(params, callback){ 
    // do some stuff 
    callback(variable1, variable1, variableN); 
    } 
} 
9

Làm thế nào về một kết thúc:

for (var i = 0; i < somearray.length; i++) { 
    var val = somearray[i][0]; 
    myclass.foo({'arg1': val}, function(v) { 
     return function() {console.log(v) }; 
    }(val)); 
} 
0
for (var i = 0; i < somearray.length; i++) 

{ 
    myclass.foo({'arg1':somearray[i][0]}, function(somearray) 
    { 
     console.log(somearray[i][0]); 
    }); 
} 

Và rồi trong chức năng gọi phương thức foo nặc danh với param.

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