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 select的操作实现代码
May 06 Javascript
jQuery关于导航条背景切换效果实现示例
Sep 04 Javascript
解析Javascript中大括号“{}”的多义性
Dec 02 Javascript
node.js中的fs.mkdir方法使用说明
Dec 17 Javascript
谈一谈jQuery核心架构设计
Mar 28 Javascript
详解webpack分离css单独打包
Jun 21 Javascript
AngularJS ng-repeat指令及Ajax的应用实例分析
Jul 06 Javascript
js动态设置select下拉菜单的默认选中项实例
Aug 21 Javascript
vue elementUI使用tabs与导航栏联动
Jun 21 Javascript
使用zrender.js绘制体温单效果
Oct 31 Javascript
Layui表格监听行单双击事件讲解
Nov 14 Javascript
JavaScript实现简单的弹窗效果
May 19 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
中国的第一台收音机
2021/03/01 无线电
一个PHP日历程序
2006/12/06 PHP
php面向对象全攻略 (四)构造方法与析构方法
2009/09/30 PHP
php中通过curl检测页面是否被百度收录
2013/09/27 PHP
PHP随机生成随机个数的字母组合示例
2014/01/14 PHP
ThinkPHP采用GET方式获取中文参数查询无结果的解决方法
2014/06/26 PHP
利用PHP获取汉字首字母并且分组排序详解
2017/10/22 PHP
JS OOP包机制,类创建的方法定义
2009/11/02 Javascript
IE6、IE7中获取Button元素的值的bug说明
2011/08/28 Javascript
jquery下div 的resize事件示例代码
2014/03/09 Javascript
JavaScript检测实例属性, 原型属性
2015/02/04 Javascript
js jquery获取当前元素的兄弟级 上一个 下一个元素
2015/09/01 Javascript
AngularJs html compiler详解及示例代码
2016/09/01 Javascript
Vue.js每天必学之Class与样式绑定
2016/09/05 Javascript
JS数组操作中的经典算法实例讲解
2017/07/26 Javascript
微信小程序左右滑动的实现代码
2017/12/15 Javascript
Three.js实现简单3D房间布局
2018/12/30 Javascript
jquery实现垂直手风琴菜单
2020/03/04 jQuery
[49:13]DOTA2上海特级锦标赛C组资格赛#1 OG VS LGD第一局
2016/02/27 DOTA
[57:18]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#3VP VS VG
2016/03/03 DOTA
python基础教程之分支、循环简单用法
2016/06/16 Python
python3中str(字符串)的使用教程
2017/03/23 Python
PyQt5每天必学之进度条效果
2018/04/19 Python
Pytorch中Tensor与各种图像格式的相互转化详解
2019/12/26 Python
pytorch查看torch.Tensor和model是否在CUDA上的实例
2020/01/03 Python
python pprint模块中print()和pprint()两者的区别
2020/02/10 Python
基于python3实现倒叙字符串
2020/02/18 Python
Python高并发和多线程有什么关系
2020/11/14 Python
金蝶的一道SQL笔试题
2012/12/18 面试题
什么是TCP/IP
2014/07/27 面试题
Discard Protocol抛弃协议的作用是什么
2015/10/10 面试题
岗位说明书范文
2014/05/07 职场文书
品牌推广活动策划方案
2014/08/19 职场文书
2015年宣传部部长竞选演讲稿
2014/11/28 职场文书
2014年出纳工作总结与计划
2014/12/09 职场文书
Python 批量下载阴阳师网站壁纸
2021/05/19 Python