2013-02-20 68 views
6

我有一个数组迭代器功能:的JavaScript:意外的typeof结果

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

和一些代码

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 
}); 

为什么typeof this内联函数object代替string内?

的jsfiddle here

+1

只是一个说明。我相信最后一条语句应该是'typeof这个=== typeof val'而不是'typeof(this === val)' – techfoobar 2013-02-20 03:54:21

+0

因为'this'不再指'arr1'。一旦你在函数中使用'this',它就会反驳那个作为对象的'function'。 – 2013-02-20 03:55:07

+1

@icanc - 事实并非如此。 '.call()'的第一个参数决定了'this'在函数内部。 – techfoobar 2013-02-20 03:56:09

回答

8

当一个方法被调用在JavaScript中,其内部设置this到调用对象:https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/apply

...和原始值将被装箱。

通过“盒装”,它们表示该基元包裹在一个对象中。请注意,这仅适用于apply/call的第一个参数。其他参数变成不是“装箱”的函数参数。

+2

按秒打败我,但我学到了一些东西! – danronmoon 2013-02-20 04:01:28