JavaScript apply和call深入了解

主要是对代码执行有点疑问,这里就不列举处理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
阅读 2.3k
2 个回答

首先把 1 拆分简化一下
Function.call.apply(function(a){return a;}, [0,4,3]);
从后往前apply改变了Function.callthisfunction(a){return a;}并给了它3个参数
Function.callthis被改变了所以 可以理解为Function被替换掉了

function(a){return a;}.call(0,4,3)

最后就是 调用 function(a){return a;} 方法 它里面的this0 有两个参数 4,3所以会输出4

将后面的几个问题带入1问题就行了

2 . {}.call(), {}没有call方法
3 . window.call(), apply第一个参数为undefined,null非严格模式会自动绑定为 window,不传为undefinedwindow没有call方法
4 . Function.call(),Function是一个构造函数 这句话 没多大用 call为空this还是window 就是 Function()
5 . window.call(), 跟3一样 call内作用域变成window

代码2:
你把Function.call当成一个function看待。这个function上调用apply方法,那么第一个参数就是this对象,而Function.call所需要的this对象必须是一个funtion,你传递的{},是一个空的对象,那么就要做类型转换,也就是从{}转换成一个function,那么肯定是会报类型转换错误,所以safari的报错是最严谨的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题