js作为一门动态语言,this的指向往往令人疑惑。js中的this总是指向一个对象。而这个对象是在运行时基于函数的执行环境动态绑定的。
实际应用中,this的指向通常分为四大类。
- 作为对象的方法调用
- 作为普通函数调用
- 构造器调用
- Function.prototype.call 或Function.prototype.apply调用
-
作为对象的方法调用
var obj = { a: 1, getA: function() { console.log( this === obj ); console.log( this.a); } } obj.getA();当函数作为对象的方法调用时,this指向该对象。
-
作为普通函数调用
window.name = 'globalName'; var getName = function () { return this.name } console.log(getName()); 或 window.name = 'globalName'; var obj = { name: 'kobe', getName: function () { return this.name; } } var getName = obj.getName; console.log(getName()); // globalName当函数作为普通函数调用时,this指向全局对象。在浏览器中即是window对象。
-
作为构造器调用
var Person = function(name) {
this.name = name;
}
var p = new Person('kobe');
console.log(p.name);
当函数作为构造器被调用时,this指向该对象。
- Function.prototype.call 或Function.prototype.apply 调用
Function.prototype.call 或Function.prototype.apply 可以动态改变传入函数的this。var obj1 = { name: 'Ben', getName: function() { return this.name; } } var obj2 = { name: 'Jason' } console.log(obj1.getName()) // 'Ben' console.log(obj1.getName.call(obj2)) // 'Jason'