this
不管用在什么场合都有一个共同点:它总是返回一个对象this
就是属性或方法“当前”所在的对象
this.property
//this就代表property属性当前所在的对象
- 由于函数可以在不同的运行环境执行,所以需要有一种机制,能够在函数体内部获得当前的运行环境(context)。所以,this就出现了,它的设计目的就是在函数体内部,指代函数当前的运行环境。
this主要有以下几个使用场合:
(1)全局环境
- 全局环境使用
this
,它指的就是顶层对象window
。
this === window // true
function f() {
console.log(this === window);
}
f() // true
上面代码说明,不管是不是在函数内部,只要是在全局环境下运行,this
就是指顶层对象window
。
(2)构造函数
- 构造函数中的
this
,指的是实例对象。
var Obj = function (p) {
this.p = p;
};
上面代码定义了一个构造函数Obj
。由于this指向实例对象,所以在构造函数内部定义this.p
,就相当于定义实例对象有一个p
属性。
(3)对象的方法
- 如果对象的方法里面包含
this
,this
的指向就是方法运行时所在的对象。该方法赋值给另一个对象,就会改变this
的指向。
使用注意点
1、避免对层this
- 由于
this
的指向是不确定的,所以切勿在函数中包含多层的this
。 - 使用一个变量固定
this
的值,然后内层函数调用这个变量,是非常常见的做法
2、避免数组处理方法中的 this
- 数组的
map
和foreach
方法,允许提供一个函数作为参数。这个函数内部不应该使用this
。
3、避免回调函数中的 this
- 回调函数中的
this
往往会改变指向,最好避免使用。
绑定 this 的方法
JavaScript 提供了call
、apply
、bind
这三个方法,来切换/固定this
的指向。
Function.prototype.call()
- 函数实例的
call
方法,可以指定函数内部this
的指向(即函数执行时所在的作用域),然后在所指定的作用域中,调用该函数。 -
call
方法的参数,应该是一个对象。如果参数为空、null
和undefined
,则默认传入全局对象。 - 如果
call
方法的参数是一个原始值,那么这个原始值会自动转成对应的包装对象,然后传入call
方法。
Function.prototype.apply()
-
apply
方法的作用与call
方法类似,也是改变this指向,然后再调用该函数。唯一的区别就是,它接收一个数组作为函数执行时的参数,使用格式如下
func.apply(thisValue, [arg1, arg2, ...])
-
apply
方法的第一个参数也是this
所要指向的那个对象,如果设为null
或undefined
,则等同于指定全局对象 - 第二个参数则是一个数组,该数组的所有成员依次作为参数,传入原函数。原函数的参数,在
call
方法中必须一个个添加,但是在apply
方法中,必须以数组形式添加。
function f(x, y){
console.log(x + y);
}
f.call(null, 1, 1) // 2
f.apply(null, [1, 1]) // 2
Function.prototype.bind()
-
bind
方法用于将函数体内的this
绑定到某个对象,然后返回一个新函数。