js學習總結----call方法深入
阿新 • • 發佈:2017-06-28
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方法深入