(一):this
1:在javascript中this指的就是函数运行时所在的上下文(即函数的运行环境);
var name = ‘张三‘; var obj = { name: ‘法外狂徒‘, action: function () { console.log(this.name + ‘的行为!‘); } } var action = obj.action; obj.action() // 法外狂徒的行为; action() // 张三的行为
上面代码中obj.action和action指向的是内存中的同一个函数(obj.action和action的值都是指向这个函数的地址),但是函数中的this指向却不相同。obj.action()中this指向obj这个对象,而action()可以写成window.action(),故this指向window。取当前环境中的name故而输出不同。
(二):call 、apply、 bind
call,apply,bind都是改变this指向的函数。
var name = ‘张三‘; var obj = { name: ‘法外狂徒‘, action: function () { console.log(this.name + ‘的行为!‘); } } var action = obj.action; obj.action.call() // 张三的行为; obj.action.apply() // 张三的行为; let temAction = ‘‘; temAction = obj.action.bind(); temAction() // 张三的行为
注意:call,apply,bind,在非严格模式中第一个参数不传或者传null、undfined时,this指向window(即全局环境);在严格模式中传谁this就指向谁,null指向null,不传或者传undefined就指向undefined;
1:fn.call()
当调用函数原型对象中的call()方法时会进行以下几步操作:
(1):首先改变操作函数中的this,使其指向call方法中的第一个实参;
(2):执行操作函数并把call方法中第一个实参以后的实参传给操作函数;
2:区别:
(1):call和apply唯一的区别就是参数的形式不同,除了第一个参数外,剩下的参数call以列表的形式一个一个传,而apply则放到一个数组中,看例子
let arr = [2,5,3,8,9,4]; Math.max.call(...arr) // 9 Math.max.apply(null,arr) // 9
(2):bind和apply的区别在于是立刻执行目标函数还是等待执行,apply是立即执行,bind则只是改变了目标函数中this的指向之后返回一个函数,不立马执行目标函数;
(三)手动实现一个call方法