this call apply 完全理解

this

this 是 JavaScript 的关键字,在函数体内部使用,其具体的指向由函数运行时的环境决定。

function Foo(){
  this.x = 1;
}

函数的具体指向根据调用情况可以分为四种情况:

1,单纯的函数调用

这是最简单的,在这种情况下,this 指向全局对象。
例子1:

var a = 123;
function foo(){
  console.log(this.a);
}
foo();    // 123

不属于任何函数的变量,或者在全局中定义的变量就是全局变量。上面代码中 a 就是全局变量。执行函数后,this 指向全局对象 window 。所以 this.a 就是 window.a

2,作为对象的方法调用

在作为对象的方法调用时,this 指向调用它的对象。谁调用包含 this 的函数,this 就指向谁。
例子2:

var obj = {
  x: 56,
  m: function(){
    console.log(this.x);
  }
};
obj.m();  // 56

在这个例子中,m 函数作为 obj 的方法被 obj 对象调用,所以 this 就指向 obj

3,作为构造函数调用

例子3:

function foo(){
  this.x = 34;
}
var age = new foo();
console.log(age.x);   // 34

可以通过构造函数 new 一个对象,this 就是指向新new出来的对象。

4,call和apply的调用

callapply 用法是一样的,只是传递参数时有些许区别。这里以 call 举例说明,
例子4:

var x = 123;
var obj = {
  x: 567,
  m: function(){
    console.log(this.x);
  }
};
obj.m();  // 567
obj.m.call(window);   // 123	  => 就是把this值指向winodw

call 接受一组参数,第一个参数就是要指向的对象。后面的参数是要传入的值。

但是这还不是关于 this 的全部。要完全理解 this 前,需要先理解这句话。

this 永远指向最后调用它的对象

我们再来看一个例子。
例子5

var obj = {
  x: 56,
  m: function(){
    console.log(this.x);     // console.log(this === window); => true
  }
};
f = obj.m;    // 如果我这么调用会显示什么?
f();          // ??

你可以先在浏览的终端中运行一下,结果是否与你想的一样。如果一样,说明你理解了上面这句话。如果不一样,则说明你对上面这句话的理解有误差。例子5的结果是 undefined。为什么会这样?

再来看一下这就话,this 永远指向最后调用它的对象 (重要的话重复三遍)f = obj.m 这句代码把 m 方法赋值给了 f 。最后 f 执行的函数。 f() 直接执行了函数,这就相当于在全局环境中执行的。所以 this 指向了全局对象 window。而全局对象中没有变量 x ,所以显示 undefined
我们可以把代码中的 console.log(this.x) 换为 console.log(this === window)。再执行一下代码,会输出为 true 。说明我们是对的。

call apply

语法:func.apply(thisArg,[argsArray])