javascript中的this详解


Posted in Javascript onDecember 08, 2014

This对象在js中就一直是个坑货,很难判断它到底指向什么,而我们由于来自C++或者python的self的经验,又常常会犯这一类的错误。接下来就详细地讲一下this对象的归属。

rule1:全局环境的this

javascript的环境天生就由函数来决定,在js里不能通过代码块隔开上下文,不被函数所包裹的环境就是全局环境,全局环境中的this就指向全局变量window,看下面一个例子

var name='jjj';

console.log(this.name);

//会成功输出jjj

rule2:作为方法调用时的this

显然这种情况很好判断,与python里的self是一致的,this毫无疑问指向调用方法的对象

var user={

    name:'kkk'

};

user.getName=function(){

    console.log(this.name);

};

user.getName();

//会输出kkk

rule3:作为构造函数时的this

这时的this也不用我多说,显然是指向新创建的对象,构造函数的运行其实并不创建对象,而仅仅是初始化,对象在运行之前就已经被创建
下面还是举例说明

function User(name){

    this.name=name;

}

var f1=new User('kkk');

var f2=User('kkk');

console.log(f1.name);//kkk

console.log(f2.name);//undefined没有name属性

rule4:间接调用中的this

所谓间接调用是指利用apply和call来调用函数,这时的this指向它们参数列表中的第一个参数。

var setName=function(name){

    this.name=name;

};

var user={level:2};

user.apply(setName,'jjj');

console.log(user.name);//jjj

rule5:其他情况中的this

记住其他情况下this均不会被改变,这里也是最容易犯错的地方。

var name = "clever coder";

var person = {

    name : "foocoder",

    hello : function(sth){

        var sayhello = function(sth) {

            console.log(this.name + " says " + sth);

        };

        sayhello(sth);

    }

}

person.hello("hello world");//clever coder says hello world

上面的代码看起来很奇怪,难道this不应该指向person吗?
我们应该记住被嵌套的函数中的this是不会指向嵌套它的函数,在这个例子里面就是sayhello中的this不会指向hello对应的那个函数。如果我们把例子稍稍改一下变成

hello:function(sth){

    console.log(this.name + " says " + sth);

}

//foocoder says hello world

大家应该已经看明白了,这个时候,sayhello并非在作为方法调用,所以this指向全局对象。。。
这时候问题来了,用node运行最初的例子会显示undefined says hello world,不知道有没有大神讲解一下。

rule6:eval破坏所有规则

最后以一个例子结束

var name = "clever coder";

var user={

    name:'kkk'

};

user.getName=function(){

    console.log(this.name);

};

var get=user.getName;

get();//clever coder

大家是否明白了?

Javascript 相关文章推荐
jQuery 学习6 操纵元素显示效果的函数
Feb 07 Javascript
ASP.NET jQuery 实例2 (表单中使用回车在TextBox之间向下移动)
Jan 13 Javascript
面向对象的Javascript之二(接口实现介绍)
Jan 27 Javascript
jquery 元素控制(追加元素/追加内容)介绍及应用
Apr 21 Javascript
微信小程序 Flex布局详解
Oct 09 Javascript
基于Angular.js实现的触摸滑动动画实例代码
Feb 19 Javascript
清空元素html("") innerHTML="" 与 empty()的区别和应用(推荐)
Aug 14 Javascript
Vee-Validate的使用方法详解
Sep 22 Javascript
npm scripts 使用指南详解
Oct 08 Javascript
详解create-react-app 2.0版本如何启用装饰器语法
Oct 23 Javascript
JavaScript静态作用域和动态作用域实例详解
Jun 17 Javascript
three.js着色器材质的内置变量示例详解
Aug 16 Javascript
node.js中的path.isAbsolute方法使用说明
Dec 08 #Javascript
node.js中的path.join方法使用说明
Dec 08 #Javascript
node.js中的path.normalize方法使用说明
Dec 08 #Javascript
node.js中的path.sep方法使用说明
Dec 08 #Javascript
node.js中的path.resolve方法使用说明
Dec 08 #Javascript
node.js中的events.EventEmitter.listenerCount方法使用说明
Dec 08 #Javascript
node.js中的dns.getServers方法使用说明
Dec 08 #Javascript
You might like
php使用PDO方法详解
2014/12/27 PHP
php类常量用法实例分析
2015/07/09 PHP
PDO的安全处理与事物处理方法
2016/10/31 PHP
新手入门常用代码集锦
2007/01/11 Javascript
javascript中的几个运算符
2007/06/29 Javascript
JS函数重载的解决方案
2014/05/13 Javascript
jquery中ajax使用error调试错误的方法
2015/02/08 Javascript
基于JavaScript实现网页倒计时自动跳转代码
2015/12/28 Javascript
JavaScript html5 canvas绘制时钟效果(二)
2016/03/27 Javascript
jQuery使用Selectator插件实现多选下拉列表过滤框(附源码下载)
2016/04/08 Javascript
Jquery 自定义事件实现发布/订阅的简单实例
2016/06/12 Javascript
JS填写银行卡号每隔4位数字加一个空格
2016/12/19 Javascript
AngularJS报错$apply already in progress的解决方法分析
2017/01/30 Javascript
微信小程序实现列表页的点赞和取消点赞功能
2018/11/02 Javascript
jsonp跨域获取百度联想词的方法分析
2019/05/13 Javascript
如何在微信小程序中实现Mixins方案
2019/06/20 Javascript
jQuery实现动态加载瀑布流
2020/09/01 jQuery
[51:34]Ti4主赛事胜者组 DK vs EG 2
2014/07/19 DOTA
利用python代码写的12306订票代码
2015/12/20 Python
python中的变量如何开辟内存
2018/06/26 Python
Django如何开发简单的查询接口详解
2019/05/17 Python
python监控进程状态,记录重启时间及进程号的实例
2019/07/15 Python
使用python实现微信小程序自动签到功能
2020/04/27 Python
selenium切换标签页解决get超时问题的完整代码
2020/08/30 Python
python判断all函数输出结果是否为true的方法
2020/12/03 Python
canvas之万花筒效果的简单实现(推荐)
2016/08/16 HTML / CSS
详解HTML5常用的语义化标签
2019/09/27 HTML / CSS
Urban Outfitters英国官网:美国平价服饰品牌
2016/11/25 全球购物
Radley英国官网:英国莱德利小狗包
2019/03/21 全球购物
Antonioli美国在线商店:时尚前卫奢华
2019/07/29 全球购物
StubHub希腊:购买体育赛事、音乐会和剧院门票
2019/08/03 全球购物
北大自主招生自荐信
2013/10/19 职场文书
行政人员工作职责
2013/12/05 职场文书
毕业证委托书范文
2014/09/26 职场文书
高中生逃课检讨书
2014/10/10 职场文书
教师政风行风自查自纠报告
2014/10/21 职场文书