2013-02-20 34 views
6

Tôi có một hàm mảng iterator:JavaScript: bất ngờ typeof kết quả

function applyCall(arr, fn) { 
    fn.call(arr[0], 0, arr[0]); 
} 

và một số mã

var arr1 = ['blah']; 
applyCall(arr1, function (i, val) { 
    alert(typeof this); // object WHY?? 
    alert(typeof val); // string 
    alert(typeof(this === val)) // alerts false, expecting true 
}); 

Tại sao typeof this bên trong hàm inline object thay vì string?

jsfiddle here

+1

Chỉ cần lưu ý. Tôi tin rằng câu lệnh cuối cùng nên là 'typeof this === typeof val' thay vì' typeof (this === val) ' – techfoobar

+0

Bởi vì' this' không đề cập đến 'arr1' nữa. Khi bạn sử dụng 'this' trong hàm, nó tham chiếu đến' function' là một đối tượng. –

+1

@icanc - Điều đó không đúng. Đối số đầu tiên cho '.call()' quyết định cái 'này' nằm bên trong hàm. – techfoobar

Trả lời

8

Khi một phương pháp được gọi là trong JavaScript, nó nội bộ this đến đối tượng gọi điện thoại: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/apply

... và các giá trị nguyên thủy sẽ được đóng hộp.

Bằng cách "đóng hộp", chúng có nghĩa là nguyên thủy được gói trong một đối tượng. Lưu ý rằng điều này chỉ áp dụng cho đối số đầu tiên là apply/call. Các đối số khác trở thành tham số hàm không được "đóng hộp".

+2

Đánh tôi bằng giây, nhưng tôi đã học được điều gì đó! – danronmoon

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