JavaScript-call&apply方法

96 阅读2分钟

要知道call和apply方法的用处,首先要知道什么是上下文

上下文分为全局上下文|函数上下文

  • 全局上下文

无论是否在严格模式下(“use strict”),在全局执行上下文中(任何函数的外部)this都指向全局对象。

var a = 'A'
console.log(window.a)   // A
this.b = 'B'
console.log(b)  // B
console.log(window.b) // B
  • 函数上下文

在函数内部,this的值取决于函数被调用的方式

  1. 简单调用

不在严格模式下,且this的值不是由该调用来设置的,所以this默认指向全局对象

<pre><code>function fn(){
    return this
}
//在浏览器中的全局对象是window
fn() === window // true
//在node中的全局对象是global
fn() === global</code></pre>

然而在严格模式下,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)