js中this指向

this 的指向

this 是 js 中定义的关键字,它自动定义于每一个函数域内,但是它的指向却让人很迷惑。在实际应用中,this 的指向大致可以分为以下四种情况。

1.作为普通函数调用

当函数作为一个普通函数被调用,this 指向全局对象。在浏览器里,全局对象就是 window。

window.name = 'linxin'; function getName(){ console.log(this.name); } getName(); // linxin

可以看出,此时 this 指向了全局对象 window。
在ECMAScript5的严格模式下,这种情况 this 已经被规定不会指向全局对象了,而是 undefined。

'use strict';
function fun(){ console.log(this); } fun(); // undefined

2.作为对象的方法调用

当函数作为一个对象里的方法被调用,this 指向该对象

var obj = { name : 'linxin', getName : function(){ console.log(this.name); } } obj.getName(); // linxin

如果把对象的方法赋值给一个变量,再调用这个变量:

var obj = { fun1 : function(){ console.log(this); } } var fun2 = obj.fun1; fun2(); // window

此时调用 fun2 方法 输出了 window 对象,说明此时 this 指向了全局对象。给 fun2 赋值,其实是相当于:

var fun2 = function(){ console.log(this); }

可以看出,此时的 this 已经跟 obj 没有任何关系了。这时 fun2 是作为普通函数调用。

3.作为构造函数调用

js中没有类,但是可以从构造器中创建对象,并提供了 new 运算符来进行调用该构造器。构造器的外表跟普通函数一样,大部分的函数都可以当做构造器使用。当构造函数被调用时,this 指向了该构造函数实例化出来的对象。

var Person = function(){ this.name = 'linxin'; } var obj = new Person(); console.log(obj.name); // linxin

如果构造函数显式的返回一个对象,那么 this 则会指向该对象。

var Person = function(){ this.name = 'linxin'; return { name : 'linshuai' } } var obj = new Person(); console.log(obj.name); // linshuai

如果该函数不用 new 调用,当作普通函数执行,那么 this 依然指向全局对象。

4.call() 或 apply() 调用

通过调用函数的 call() 或 apply() 方法可动态的改变 this 的指向。

var obj1 = { name : 'linxin', getName : function(){ console.log(this.name); } } var obj2 = { name : 'linshuai' } obj1.getName(); // linxin obj1.getName.call(obj2); // linshuai obj1.getName.apply(obj2); // linshuai


作者: linshuai 
链接:http://www.imooc.com/article/17133
来源:慕课网
本文原创发布于慕课网 ,转载请注明出处,谢谢合作!

转载于:https://www.cnblogs.com/tian0o0/p/7444518.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值