this 关键字
简略说,this
就是属性或办法“以后”所在的对象。
this.property
var person = {
name: '张三',
describe: function () {return '姓名:'+ this.name;}
};
person.describe()
// "姓名:张三"
下面代码中,this.name
示意 name
属性所在的那个对象。因为 this.name
是在 describe
办法中调用,而 describe
办法所在的以后对象是 person
,因而this
指向 person
,this.name
就是person.name
。
应用场合
(1)全局环境
全局环境应用this
,它指的就是顶层对象window
。
this === window // true
function f() {console.log(this === window);
}
f() // true
(2)构造函数
构造函数中的this
,指的是实例对象。
var Obj = function (p) {this.p = p;};
如果对象的办法外面蕴含 this
,this
的指向就是办法运行时所在的对象。该办法赋值给另一个对象,就会扭转 this
的指向。
var obj ={foo: function () {console.log(this);
}
};
obj.foo() // obj
下面代码中,obj.foo
办法执行时,它外部的 this
指向obj
。
然而,上面这几种用法,都会扭转 this
的指向。
绑定 this 的办法
Function.prototype.call()
函数实例的 call
办法,能够指定函数外部 this
的指向(即函数执行时所在的作用域),而后在所指定的作用域中,调用该函数。
var obj = {};
var f = function () {return this;};
f() === window // true
f.call(obj) === obj // true
下面代码中,全局环境运行函数 f
时,this
指向全局环境(浏览器为 window
对象);call
办法能够扭转 this
的指向,指定 this
指向对象 obj
,而后在对象obj
的作用域中运行函数f
。
Function.prototype.apply()
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
绑定到某个对象,而后返回一个新函数。
var d = new Date();
d.getTime() // 1481869925657
var print = d.getTime;
print() // Uncaught TypeError: this is not a Date object.
下面代码中,咱们将 d.getTime()
办法赋给变量 print
,而后调用print()
就报错了。这是因为 getTime()
办法外部的 this
,绑定Date
对象的实例,赋给变量 print
当前,外部的 this
曾经不指向 Date
对象的实例了。
bind()
办法能够解决这个问题。