首頁  >  文章  >  web前端  >  面試題目:JavaScript中call方法

面試題目:JavaScript中call方法

yulia
yulia原創
2018-09-08 17:06:151211瀏覽

主題:

function fn(a,b){
    console.log(this);
    console.log(a);
    console.log(a+b);
}
fn.call(1);
fn.call.call(fn);
fn.call.call.call(fn,1,2);
fn.call.call.call.call(fn,1,2,3);

答案:
fn.call(1);  // 1,undefined,NaN
fn.call.call(fn);   // fn, undefined,NaN 
fn.call.call.call(fn,1,2);  //  1,2,NaN
fn.call.call.call.call(fn,1,2,3); //  1,2,5

深層解題思路:
fn.call(1);call的第一個參數改變call前面函數裡的關鍵字this所以輸出1;後面沒有參數所以a,b為undefined,相加結果為NaN;
fn.call.call(fn);這一塊是個難點,不過也很好理解! fn.call 找到Function.prototype上的call方法(這也是一個函數,也是函數類別
                 的一個實例,也可以繼續將一個函數呼叫call/apply等方法)我們可以將一個函數接一個函數fnA.下就等於A.call(fn),這
                 裡執行call方法,以A 中的關鍵字this修改為函數fn ,然後再把函數A(fn.call) 執行;#fn. call.call(fn,1,2);透過上一條的原型鏈的方法我們可以把fn.call.call.call 看成A(fn.call.call).call 執行,此時括
             的參數fn 已經作為函數執行了,所以就成了A.call(1,2) 執行! 1作為第一個參數改變 call 前面函數裡的this,
                 後面的參數以實參傳遞給函數的形參裡! 
fn.call.call.call.call(fn,1,2,3); 同上一條原理!

概括性總結:
不太理解的話也可以記住這個概括性訣竅:
碰到兩個及兩個以上的call都是讓第一個參數執行,第一個參數必須是函數;
第二個參數是改變第一個參數中this;
第三個及第三個以後的參數作為實參傳給第一個參數。

以上是面試題目:JavaScript中call方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn