2013-07-24 18 views
6

Tôi thừa hưởng một số mã với một dòng mà tôi không hiểu.Sử dụng "this" làm chức năng?

function updateQty() { 
     obj.find('.inputAmount').html(qty); 
     input.val(qty); 

     $.each(change_actions, function() { 
      this(qty); 
     }); 
    } 

Chính xác điều gì đang xảy ra bên trong chức năng .each? Tôi chưa bao giờ thấy this(var) được sử dụng theo cách này trước đây.

+9

change_actions phải là một mảng các hàm. trong js đơn giản, nó hoạt động như: hàm apply (v) {return this (v);} [1,2,3] .map (apply, RegExp); – dandavis

+0

Thêm 'console.log (this)' hoặc 'console.dir (this)' vào phần gọi lại và xem 'this' là gì. – fardjad

+0

Hàm $ .each() có thể được sử dụng để lặp qua bất kỳ bộ sưu tập nào, cho dù đó là một đối tượng hay một mảng. Trong trường hợp của một mảng, hàm gọi lại được chuyển qua một chỉ mục mảng và một giá trị mảng tương ứng mỗi lần. (Giá trị cũng có thể được truy cập thông qua từ khóa này ...) từ đây: http://api.jquery.com/jQuery.each/ – svillamayor

Trả lời

3

thiết lập giả các sự kiện riêng của họ với các ràng buộc, do đó rất có thể là change_actions là chức năng được đăng ký để chạy khi một cái gì đó xảy ra với số lượng.

Hãy thử một cái gì đó như thế này:

// initialize with a value 
var actions = [ 
    function(x){ console.log('I see a new x: ' + x); } 
]; 

// add actions "later" 
actions.push(function(x){ console.log('Yup, a new x: ' + x); }); 

// Then execute them: 
$.each(actions, function(){ 
    this(4); 
}); 

// add another one still 
actions.push(function(x){ console.log(x + ' looks new'); }); 

// re-iterate over them 
// Then execute them: 
$.each(actions, function(){ 
    this(5); 
}); 

và kết quả:

// first iteration (only 2 subscribed events) 
[15:56:50.030] "I see a new x: 4" 
[15:56:50.030] "Yup, a new x: 4" 

// second iteration (now we have 3, one was added later) 
[15:56:50.030] "I see a new x: 5" 
[15:56:50.030] "Yup, a new x: 5" 
[15:56:50.030] "5 looks new" // <-- new subscription 

nghĩ về nó như sự kiện click và làm thế nào bạn có thể thêm các đăng ký bằng cách gắn vào $('element').click(). mỗi khi một nhấp chuột xảy ra, mọi sự kiện đã đăng ký sẽ được kích hoạt.

5

this bên trong của $.each là các đối tượng hiện tại mà bạn đang lặp qua.

Đối tượng phải là một chức năng để truyền đạt thứ gì đó cho nó.

3

Bạn có thể liên quan đến các ví dụ sau:

var change_actions = [ 
    function(x) { alert(x + 1); }, 
    function(x) { alert(x + 2); } 
]; 

var qty = 5; 
$.each(change_actions, function() { 
    this(qty); 
}); 

JSFiddle: http://jsfiddle.net/fuyz2/