要知道call和apply方法的用处,首先要知道什么是上下文
上下文分为全局上下文|函数上下文
-
全局上下文
无论是否在严格模式下(“use strict”),在全局执行上下文中(任何函数的外部)this都指向全局对象。
var a = 'A'console.log(window.a) // Athis.b = 'B'console.log(b) // Bconsole.log(window.b) // B复制代码
-
函数上下文
在函数内部,this的值取决于函数被调用的方式
- 简单调用
不在严格模式下,且this的值不是由该调用来设置的,所以this默认指向全局对象
复制代码function fn(){ return this}//在浏览器中的全局对象是windowfn() === window // true//在node中的全局对象是globalfn() === global
然而在严格模式下,this将保持它进入执行上下文时的值
function fn(){"use strict"return this}fn() === undefined //true复制代码所以在严格模式下,this没有被执行上下文定义,它将保持undefined
如果想把this的值从一个上下文传到另一个,就需要适应call和apply
//将一个对象作为call和apply的第一个参数,this会被绑定到这个对象var obj = {a: '郭嘉'}var a = '郭奉孝'function fn(){ return this.a // this的值取决于函数调用的方式}fn() //'郭奉孝'fn.call(obj) // '郭嘉'fn.apply(obj) //'郭嘉'复制代码
call和apply方法的作用完全一样,区别在于第二个参数的不同;call的第二个参数是单个元素,apply的第二个参数是一个数组
2. 作为对象的方法当函数作为一个对象的方法时,this指向这个对象
3. 作为构造函数当一个函数作为构造函数时(使用new关键字),this绑定到正在构造的新对象
[参考自MDN](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/this)