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 相关文章推荐
js中window.open打开一个新的页面
Aug 10 Javascript
JS+CSS实现感应鼠标渐变显示DIV层的方法
Feb 20 Javascript
javascript每日必学之循环
Feb 19 Javascript
js与jquery正则验证电子邮箱、手机号、邮政编码的方法
Jul 04 Javascript
jQuery fadeOut 异步实例代码详解
Aug 18 Javascript
使用cropper.js裁剪头像的实例代码
Sep 29 Javascript
VUE前端cookie简单操作
Oct 17 Javascript
详解vue-router 初始化时做了什么
Jun 11 Javascript
手动下载Chrome并解决puppeteer无法使用问题
Nov 12 Javascript
webpack3里使用uglifyjs压缩js时打包报错的解决
Dec 13 Javascript
如何用vue-cli3脚手架搭建一个基于ts的基础脚手架的方法
Dec 12 Javascript
小程序自定义轮播图圆点组件
Jun 25 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
Terran剧情介绍
2020/03/14 星际争霸
PHP4中session登录页面的应用
2008/07/25 PHP
php防止网站被刷新的方法汇总
2014/12/01 PHP
PHP常用操作类之通信数据封装类的实现
2017/07/16 PHP
myeclipse安装jQuery插件的方法
2011/03/29 Javascript
基于jquery跨浏览器显示的file上传控件
2011/10/24 Javascript
Three.js源码阅读笔记(Object3D类)
2012/12/27 Javascript
jQuery函数的第二个参数获取指定上下文中的DOM元素
2014/05/19 Javascript
javascript数据类型示例分享
2015/01/19 Javascript
js识别uc浏览器的代码
2015/11/06 Javascript
HTML5游戏引擎LTweenLite实现的超帅动画效果(附demo源码下载)
2016/01/26 Javascript
js获取当前时间(昨天、今天、明天)
2016/11/23 Javascript
浅谈regExp的test方法取得的值变化的原因及处理方法
2017/03/01 Javascript
JS数组求和的常用方法总结【5种方法】
2019/01/14 Javascript
解决vue动态下拉菜单 有数据未反应的问题
2020/08/06 Javascript
[49:40]2018DOTA2亚洲邀请赛小组赛 A组加赛 TNC vs Newbee
2018/04/03 DOTA
Python使用shelve模块实现简单数据存储的方法
2015/05/20 Python
python中is与双等于号“==”的区别示例详解
2017/11/21 Python
pyspark操作MongoDB的方法步骤
2019/01/04 Python
Python中的十大图像处理工具(小结)
2019/06/10 Python
GitHub上值得推荐的8个python 项目
2020/10/30 Python
CSS3教程(4):网页边框和网页文字阴影
2009/04/02 HTML / CSS
CSS3 Media Queries详细介绍和使用实例
2014/05/08 HTML / CSS
HTML5通过调用canvas对象的getContext()方法来获取绘图环境
2014/06/23 HTML / CSS
很酷的HTML5电子书翻页动画特效
2016/02/25 HTML / CSS
HTML5实现直播间评论滚动效果的代码
2020/05/27 HTML / CSS
Sam’s Club山姆会员商店:沃尔玛旗下高端会员制商店
2017/01/16 全球购物
Windows和Linux动态库应用异同
2016/07/28 面试题
一月红领巾广播稿
2014/02/11 职场文书
学习雷锋月活动总结
2014/07/03 职场文书
省委召开党的群众路线教育实践活动总结大会报告
2014/10/21 职场文书
2015民办小学年度工作总结
2015/05/26 职场文书
运动会宣传稿100字
2015/07/23 职场文书
小学感恩主题班会
2015/08/12 职场文书
描写九月优美句子(39条)
2019/09/11 职场文书
Java Spring读取和存储详细操作
2022/08/05 Java/Android