主要是对代码执行有点疑问,这里就不列举处理apply和call的用法了。代码如下,从代码2开始就不明白了,查看ECMAScript 标准也不明白,望能得到大神解答
代码1
Function.call.apply(function(a){return a;}, [0,4,3]);
执行结果
4
代码2
Function.call.apply({}, [0,4,3]);
执行结果
Uncaught TypeError: Function.call.apply is not a function // chrome
TypeError: Object is not a function // safari
代码3
Function.call.apply()
执行结果
Uncaught TypeError: Function.call.apply is not a function // chrome
TypeError: undefined is not a function // safari
代码4
Function.call()
执行结果
function anonymous() {
} // safari or chrome
代码5
var test = Function.call;
console.log(typeof test);
test();
执行结果
'function' // console
Uncaught TypeError: test is not a function // test(); chrome
TypeError: undefined is not a function // test(); safari
首先把
1
拆分简化一下Function.call.apply(function(a){return a;}, [0,4,3]);
从后往前
apply
改变了Function.call
里this
为function(a){return a;}
并给了它3
个参数Function.call
的this
被改变了所以 可以理解为Function
被替换掉了最后就是 调用
function(a){return a;}
方法 它里面的this
是0
有两个参数4,3
所以会输出4
将后面的几个问题带入
1
问题就行了2 .
{}.call()
,{}
没有call
方法3 .
window.call()
,apply
第一个参数为undefined,null
非严格模式会自动绑定为window
,不传为undefined
,window
没有call
方法4 .
Function.call()
,Function
是一个构造函数 这句话 没多大用call
为空this
还是window
就是Function()
5 .
window.call()
, 跟3
一样call
内作用域变成window