1. 程式人生 > >js學習總結----call方法深入

js學習總結----call方法深入

pro 是我 學習總結 type 模擬 eva -- tex span

     var obj = {name:"張三"}
        function fn(){
            console.log(this)
        }
        fn();
        obj.fn(); // obj.fn is not a function
        fn.call(obj)
        //首先我們讓原型上的call方法執行,在執行call方法的時候,我們讓fn方法中的this變為第一個參數值obj;然後再把fn這個函數執行.
//自己模擬內置的call方法,寫一個myCall方法,深入探討call原理
        Function.prototype.myCall = function
(context){ /* myCall方法中的this就是當前我要操作和改變其this關鍵字的那個函數名 讓this這個函數中的"this關鍵字"變成context */ //1、讓fn中的this關鍵字變為context的值->obj eval(this.toString().replace(‘this‘,context)) //2、讓fn方法執行 this(); } fn.myCall(obj);
//首先fn1通過原型鏈機制找到Function.prototype上的call方法,並且讓call()方法執行->此時call這個方法中的this就是我要操作的fn1,在call方法代碼執行過程中首先讓fn1中的"this關鍵字"變成fn2,然後在讓這個方法執行->1
        fn1.call.call(fn2)
        /*
            首先fn1通過原型鏈機制找到Function.prototype上的call方法,然後在讓call方法通過原型在找到Function原型上的call(因為call本身的值也是一個函數,所以同樣可以找到Function.prototype),在第二次找到call的時候讓方法執行,方法中的this是fn1.call,然後讓這個方法中的this變成fn2,最後fn1.call執行->2
        
*/

js學習總結----call方法深入