js手写call的问题

js手写call的问题

let result = context.fn(...arg); 这个地方为什么是隐式绑定,不太理解,隐式绑定不是对象调用方法的时候才是吗

// 思路:将~要改变this指向的方法,挂到目标对象上执行并返回

Function.prototype.myCall = function(context) {

if(typeof this !== 'function') {

throw new TypeError('not function')

}

context = context || window

//***************************************************************************************************

// 这三步也可以这样理解:

// this指的就是调用call 方法的函数

// 给当前上下文(call方法的第一个参数)添加一个属性fn,属性值为this,当前上下文就可以调用这个方法了。

// 把call方法传入的其他的参数传入到属性fn指代的函数中,直接调用函数

// f.myCall(obj) 就是将f方法添加到obj的属性中,f中的this 指向 obj

context.fn = this; //this指向的是当前的函数(Function实例)

let arg = [...arguments].slice(1); //获取除了this指向对象以外的参数,空数组slice后返回仍是空数组

let result = context.fn(...arg); //隐式绑定,当前函数的this指向context

//***************************************************************************************************

delete context.fn

return result

}

代码出处https://www.cnblogs.com/james...


回答:

var foo = {

name: 'my name'

}

function sayname(){

console.log(this.name)

}

sayname.call(foo)

你看这个例子,你的源码里context.fn(...arg)前面这些代码的意思其实是组装了一下对象

foo = {

name: 'my name',

sayname(){

console.log(this.name)

}

}

也就是可以理解为foo.sayname(),那么sayname里的this自然就指向了foo,也就实现了call的效果

以上是 js手写call的问题 的全部内容, 来源链接: utcz.com/p/936548.html

回到顶部