源码
还没找到
比较
用法
实质
var lucky ={ name:‘lucky‘, age:18, } function selfIntroduction(){ console.log(‘我的名字是‘+this.name , ‘今年‘+this.age)} selfIntroduction.call(lucky) 我的名字是lucky 今年18
表面上看 call 改变了 selfIntroduction 函数的 this 指向,使 this 指向了 lucky
其实改变 this 指向的方法是 将 selfIntroduction 函数赋值给 lucky 对象(用完再删除) :
Function.prototype.callCall = function(context){
var context= context || window
context.fn = this //将调用的函数放进context中
context.fn() //调用函数
delete context.fn //删除添加到context中的函数
}
对于 call 函数 中的参数可以用arguments 获取
Function.prototype.callCall = function(context){
var context = context || window context.fn = this //将调用的函数放进context中 var arg = [] for(var i = 1 ,lenth=arguments.length; i<length ;i++){ arg.push(‘arguments[‘ + i + ‘]‘) } eval(‘context.fn(‘ + arg + ‘)‘)//调用 eval 函数传arg参数
delete context.fn //删除添加到context中的函数 }
还需注意的地方:
Function.prototype.callCall = function(context){
var context = context || window context.fn = this //将调用的函数放进context中 var arg = [] for(var i = 1 ,lenth=arguments.length; i<length ;i++){ arg.push(‘arguments[‘ + i + ‘]‘) } eval(‘context.fn(‘ + arg + ‘)‘)//调用 eval 函数传arg参数 delete context.fn //删除添加到context中的函数 }
2. 函数有返回值
Function.prototype.callCall = function(context){ var context = context || window context.fn = this //将调用的函数放进context中 var arg = [] for(var i = 1 ,lenth=arguments.length; i<length ;i++){ arg.push(‘arguments[‘ + i + ‘]‘) } var result = eval(‘context.fn(‘ + arg + ‘)‘)//调用 eval 函数传arg参数 delete context.fn //删除添加到context中的函数 } return result
至此 call 的模拟已经完成(等下次遇到call ,apply,bind 不理解了再后续更新)
学习于 冴羽 及网上能查到的各种资料 博客
有理解不对的地方评论或者私信可以讨论??
javascript 模拟实现call apply 和bind
原文:https://www.cnblogs.com/fromIceWorld/p/12162874.html