js学习总结----call方法深入
2021-07-10 10:06
标签:code this关键字 name 改变 探讨 模拟 var span contex js学习总结----call方法深入 标签:code this关键字 name 改变 探讨 模拟 var span contex 原文地址:http://www.cnblogs.com/diasa-fly/p/7090746.html 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
*/