Table of Contents generated with DocToc (opens new window)

# call,apply,bind的使用

  • Function.prototype.apply() (opens new window)

    apply() 方法调用一个具有给定this值的函数,以及作为一个数组(或类似数组对象 (opens new window))提供的参数。

    function.apply(thisArg, [...argsArray])
    
    1
  • Function.prototype.bind() (opens new window)

    bind() 方法创建一个新的函数,在 bind() 被调用时,这个新函数的 this 被指定为 bind() 的第一个参数,而其余参数将作为新函数的参数,供调用时使用。

  • Function.prototype.call()

    call() 方法使用一个指定的 this 值和单独给出的一个或多个参数来调用一个函数。

    function.call(thisArg, arg1,arg2...)
    
    1

注意:该方法的语法和作用与 apply() (opens new window) 方法类似,只有一个区别,就是 call() 方法接受的是一个参数列表,而 apply() 方法接受的是一个包含多个参数的数组。

总结:

call和apply都是用来调用函数的,区别就在于二者接受的第二个参数不一样,call接受的是一个个参数,apply是接受一个数组或类数组类型的; 而bind则是创建一个新的函数。

let a = 20;
var o = {
  a: 10,
  fn1: function () {
    console.log(this == o);
    console.log(this.a);
  },
  b: {
    a: 12,
    fn: function () {
      console.log(this == o);
      console.log(this.a); //12
    },
  },
};
// var j = o.fn1.bind(o);
// j();
var j = o.fn1;
j.call(o);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

首先,要弄明白这三个函数存在的意义是什么?

答案是改变函数执行时的上下文,也就是改变函数运行时的this指向。

# 箭头函数

“箭头函数”的this,总是指向定义时所在的对象,而不是运行时所在的对象。

箭头函数没有this,它的this取决于该函数外部非箭头函数的this值

var name = 'global'
const o = {
  name: 'local',
  getName: () => {
    console.log(this.name)
  },
  getName2() {
    console.log(this.name)
  },
  getName3: function () {
    console.log(this.name)
  }
}

o.getName() // global
o.getName2() // local
o.getName3() // local
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# this指向问题

# 函数this

this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象

const和 let不会在全局声明时(在最顶部的范围)创建window (opens new window) 对象的属性。

即在全局时,通过const 和 let的声明不会挂载到window上,也无法通过this获取

函数在调用call、apply时,第一个参数 用于函数内部 上下文this 。

js中的this指向 (opens new window)

文章中指出当this碰到return时,如果return的是一个对象,那么this就指向这个对象;如果函数返回值不是一个对象(包括undefined),那么this还是指向函数实例。其中null比较特殊,虽然时对象,但还是指向函数实例。

总结就是: 箭头函数的this指向定义时所在的对象,而普通函数的this由运行时所在对象决定,即谁调用就指向谁。