//给所有函数添加一个hycall的方法 模拟call
Function.prototype.hycall = function () {
//call函数通过.call()会调用一次函数,那么在这个函数中也要执行一下调用hycall的那个函数
// 问题:得可以获取到哪一个函数执行了hycall
var fn = this;
fn()
}
function sum(num1,num2) {
return num1+num2
}
function foo() {
console.log('foo函数被执行')
}
// 系统函数的call方法
//1.foo会被调用一次
//2.foo.call({}),而且会绑定this,this指向传入call函数的值
foo.call()
// this默认绑定
foo.hycall()//此时调用hycall会执行一次foo
sum.hycall()//此时调用hycall会执行一次foo
call()是c++实现的
这里用js模拟foo.call()传入的参数的实现
Function.prototype.hycall = function (thisArg) {
//call函数通过.call()会调用一次函数,那么在这个函数中也要执行一下调用hycall的那个函数
// 问题:得可以获取到哪一个函数执行了hycall
var fn = this;//获取需要被执行的函数
//this指向传入的参数
//方法一:(不推荐 本身就是要实现call)
fn.call(thisArg)//调用需要被执行的函数
//方法二:
thisArg.fn=fn//thisArg如果是23数字会报错 可以var num=new Number(123) 因为这时候num
thisArg.fn()//隐式绑定--传入的就可以被隐式绑定了
delete thisArg.fn//thisArg会多出一个fn的属性,可以等到调用完删除
}
完整
// 给所有的函数添加一个hycall的方法
Function.prototype.hycall = function(thisArg, ...args) {
// 在这里可以去执行调用的那个函数(foo)
// 问题: 得可以获取到是哪一个函数执行了hycall
// 1.获取需要被执行的函数
// this
var fn = this
// 2.对thisArg转成对象类型(防止它传入的是非对象类型)
thisArg = (thisArg !== null && thisArg !== undefined) ? Object(thisArg): window
// 3.调用需要被执行的函数
thisArg.fn = fn
var result = thisArg.fn(...args)//传递参数处理 此处会调用一次函数
delete thisArg.fn
// 4.将最终的结果返回出去
//函数有无返回值取决于外部是否需要函数的结果
return result
}
function foo() {
console.log("foo函数被执行", this)
}
function sum(num1, num2) {
console.log("sum函数被执行", this, num1, num2)
return num1 + num2
}
// 系统的函数的call方法
foo.call(undefined)
var result = sum.call({}, 20, 30)