Javascript:必须知道的Javascript知识点之“this指针”

很多人都知道this指针,这篇文章的主要目的是为了培训我们公司的新人。

默认的this指针指向

规则1

this指针默认指向方法调用时为其指定的对象,如:obj.fun(),fun方法体中的this指针指向obj。

1 var user = { name: '段光伟' };
2 user.getName = function(){ return this.name; };
3 user.getName();  //返回‘段光伟’
1 var user = { name: '段光伟' };
2 user.getName = function(){ return this.name; };
3 user.getName();  //返回‘段光伟’
4 
5 window.name = '李妞妞';
6 window.getName = user.getName
7 window.getName();  //返回‘李妞妞’
8 getName();  //返回‘李妞妞’

规则2

如果在方法调用时没有为方法指定对象则this指针默认指向window,如:fun(),fun方法体中的this指针指向window。

1 var fun = function(){
2   return this;
3 }
4 fun();  //返回window对象

规则3

没有在方法体中的代码可以看作执行在一个匿名方法,根据规则2可以推论出其this指针指向window。

1 this  //window对象

改变this指针的默认指向

使用apply

1 var user = { name: '段光伟' };
2 user.hi= function(message){ return this.name+':'+message; };
3 window.name = '李妞妞'
4 user.hi('你好');  //输出‘段光伟:你好’
5 user.hi.apply(window, ['你好']);  //输出‘李妞妞:你好’

使用call

1 var user = { name: '段光伟' };
2 user.hi= function(message){ return this.name+':'+message; };
3 window.name = '李妞妞'
4 user.hi('你好');  //输出‘段光伟:你好’
5 user.hi.call(window, '你好');  //输出‘李妞妞:你好’

构造函数中的this指向

构造函数中的this指针默认指向执行正在构造的对象。

1 var User = function(name){
2    this.name = name;
3 };
4 User.prototype.hi = function(){
5    return this.name;
6 };
7 var user = new User('段光伟');
8 user.hi();  //输出‘段光伟’

最后的小测试

猜猜最后的输出时什么?

 1 var User = function(name){
 2     this.name = name;
 3  };
 4  User.prototype.hi = function(){
 5     return this.name;
 6  };
 7  var user = new User('段光伟');
 8  user.hi();  //输出‘段光伟’
 9 
10 var hi = user.hi;
11 
12 hi();  //猜猜这里的输出

object expression.method();会被翻译为object expression.method.call(object expression);。而var temp = object expression.method;temp();会被翻译为var temp = object expression.method;temp.call(window)。

原文地址:https://www.cnblogs.com/happyframework/p/3036375.html