鍍金池/ 問(wèn)答/數(shù)據(jù)庫(kù)  網(wǎng)絡(luò)安全  HTML/ JavaScript apply和call深入了解

JavaScript apply和call深入了解

主要是對(duì)代碼執(zhí)行有點(diǎn)疑問(wèn),這里就不列舉處理apply和call的用法了。代碼如下,從代碼2開始就不明白了,查看ECMAScript 標(biāo)準(zhǔn)也不明白,望能得到大神解答

代碼1

Function.call.apply(function(a){return a;}, [0,4,3]);  

執(zhí)行結(jié)果

4

代碼2

Function.call.apply({}, [0,4,3]);

執(zhí)行結(jié)果

Uncaught TypeError: Function.call.apply is not a function // chrome
TypeError: Object is not a function // safari

代碼3

Function.call.apply()

執(zhí)行結(jié)果

Uncaught TypeError: Function.call.apply is not a function // chrome
TypeError: undefined is not a function // safari

代碼4

Function.call()

執(zhí)行結(jié)果

function anonymous() {

} // safari or chrome

代碼5

var test  = Function.call;
console.log(typeof test);
test();

執(zhí)行結(jié)果

'function' // console
Uncaught TypeError: test is not a function // test();  chrome
TypeError: undefined is not a function // test(); safari
回答
編輯回答
心悲涼

代碼2:
你把Function.call當(dāng)成一個(gè)function看待。這個(gè)function上調(diào)用apply方法,那么第一個(gè)參數(shù)就是this對(duì)象,而Function.call所需要的this對(duì)象必須是一個(gè)funtion,你傳遞的{},是一個(gè)空的對(duì)象,那么就要做類型轉(zhuǎn)換,也就是從{}轉(zhuǎn)換成一個(gè)function,那么肯定是會(huì)報(bào)類型轉(zhuǎn)換錯(cuò)誤,所以safari的報(bào)錯(cuò)是最嚴(yán)謹(jǐn)?shù)摹?/p>

2018年2月27日 16:16
編輯回答
只愛(ài)你

首先把 1 拆分簡(jiǎn)化一下
Function.call.apply(function(a){return a;}, [0,4,3]);
從后往前apply改變了Function.callthisfunction(a){return a;}并給了它3個(gè)參數(shù)
Function.callthis被改變了所以 可以理解為Function被替換掉了

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

最后就是 調(diào)用 function(a){return a;} 方法 它里面的this0 有兩個(gè)參數(shù) 4,3所以會(huì)輸出4

將后面的幾個(gè)問(wèn)題帶入1問(wèn)題就行了

2 . {}.call(), {}沒(méi)有call方法
3 . window.call(), apply第一個(gè)參數(shù)為undefined,null非嚴(yán)格模式會(huì)自動(dòng)綁定為 window,不傳為undefined,window沒(méi)有call方法
4 . Function.call(),Function是一個(gè)構(gòu)造函數(shù) 這句話 沒(méi)多大用 call為空this還是window 就是 Function()
5 . window.call(), 跟3一樣 call內(nèi)作用域變成window

2017年8月6日 19:06