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粘帖屏幕截图到web页面插件screenshot-paste
Aug 21 Javascript
JS获取url参数、主域名的方法实例分析
Aug 03 Javascript
总结十个Angular.js由浅入深的面试问题
Aug 26 Javascript
JS获取IE版本号与HTML设置IE文档模式的方法
Oct 09 Javascript
Bootstrap基本插件学习笔记之Tooltip提示工具(18)
Dec 08 Javascript
zTree异步加载展开第一级节点的实现方法
Sep 05 Javascript
node使用Koa2搭建web项目的方法
Oct 17 Javascript
解决vue 中 echart 在子组件中只显示一次的问题
Aug 07 Javascript
vue开发环境配置跨域的方法步骤
Jan 16 Javascript
vue实现codemirror代码编辑器中的SQL代码格式化功能
Aug 27 Javascript
Vue获取微博授权URL代码实例
Nov 04 Javascript
JavaScript实现点击切换验证码及校验
Jan 10 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下的权限算法的实现
2007/04/28 PHP
完整删除ecshop中获取店铺信息的API
2014/12/24 PHP
php从给定url获取文件扩展名的方法
2015/03/14 PHP
php查询whois信息的方法
2015/06/08 PHP
表单提交验证类
2006/07/14 Javascript
ExtJS 简介 让你知道extjs是什么
2008/12/29 Javascript
10个实用的脚本代码工具
2010/05/04 Javascript
三种动态加载js的jquery实例代码另附去除js方法
2014/04/30 Javascript
JS实现DIV容器赋值的方法
2015/12/14 Javascript
JS操作COOKIE实现备忘记录的方法
2016/04/01 Javascript
jQuery 实现评论等级好评差评特效
2016/05/06 Javascript
javascript解决小数的加减乘除精度丢失的方案
2016/05/31 Javascript
微信小程序 后台登录(非微信账号)实例详解
2017/03/31 Javascript
js使用原型对象(prototype)需要注意的地方
2017/08/28 Javascript
Redux 和 Mobx的选择问题:让你不再困惑!
2017/09/18 Javascript
Vue-router结合transition实现app前进后退动画切换效果的实例
2017/10/11 Javascript
vue.js 底部导航栏 一级路由显示 子路由不显示的解决方法
2018/03/09 Javascript
JS解析后台返回的JSON格式数据实例
2018/08/06 Javascript
解决Vue 刷新页面导航显示高亮位置不对问题
2019/12/25 Javascript
JS如何生成动态列表
2020/09/22 Javascript
vue组件添加事件@click.native操作
2020/10/30 Javascript
使用IPython来操作Docker容器的入门指引
2015/04/08 Python
NumPy 数组使用大全
2019/04/25 Python
django 模型中的计算字段实例
2020/05/19 Python
图解Python中深浅copy(通俗易懂)
2020/09/03 Python
加拿大著名时装品牌:SOIA & KYO
2016/08/23 全球购物
Mio Skincare美国官网:身体紧致及孕期身体护理
2017/03/05 全球购物
美国正版电视节目和电影在线观看:Hulu
2018/05/24 全球购物
德国自行车商店:Tretwerk
2019/06/21 全球购物
后勤自我鉴定
2013/10/13 职场文书
派出所副所长四风问题个人整改措施思想汇报
2014/10/13 职场文书
2014幼儿园大班工作总结
2014/11/10 职场文书
工程部经理岗位职责
2015/02/02 职场文书
初一英语教学反思
2016/02/15 职场文书
高三生物教学反思
2016/02/22 职场文书
教你用python实现一个无界面的小型图书管理系统
2021/05/21 Python