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 国际象棋棋盘 实现代码
Jun 26 Javascript
Jquery实战_读书笔记1—选择jQuery
Jan 22 Javascript
通过action传过来的值在option获取进行验证的方法
Nov 14 Javascript
JS实现匀速运动的代码实例
Nov 29 Javascript
基于javascript的JSON格式页面展示美化方法
Jul 02 Javascript
超链接的禁用属性Disabled使用示例
Jul 31 Javascript
谈谈Jquery ajax中success和complete有哪些不同点
Nov 20 Javascript
jQuery基础知识点总结(DOM操作)
Jun 01 Javascript
全面解析JavaScript里的循环方法之forEach,for-in,for-of
Apr 20 Javascript
JavaScript数组迭代方法
Mar 03 Javascript
基于 Vue.js 2.0 酷炫自适应背景视频登录页面实现方式
Jan 17 Javascript
Vue开发之封装上传文件组件与用法示例
Apr 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
PHP Zip解压 文件在线解压缩的函数代码
2010/05/26 PHP
PHP file_get_contents函数读取远程数据超时的解决方法
2015/05/13 PHP
总结PHP中DateTime的常用方法
2016/08/11 PHP
Laravel 解决composer相关操作提示php相关异常的问题
2019/10/23 PHP
JS弹出对话框返回值代码(asp.net后台)
2010/12/28 Javascript
jquery实现加载进度条提示效果
2015/11/23 Javascript
深入浅析Node.js 事件循环
2015/12/20 Javascript
Vue.js一个文件对应一个组件实践
2016/10/27 Javascript
一个非常好用的文字滚动的案例,鼠标悬浮可暂停[两种方案任选]
2016/12/01 Javascript
浅谈angular4生命周期钩子
2017/09/05 Javascript
js移动端图片压缩上传功能
2020/08/18 Javascript
基于vue-ssr服务端渲染入门详解
2018/01/08 Javascript
vue.js打包之后可能会遇到的坑!
2018/06/03 Javascript
详解Element 指令clickoutside源码分析
2019/02/15 Javascript
js实现点赞效果
2020/03/16 Javascript
[02:23]完美世界全国高校联赛街访DOTA2第一期
2019/11/28 DOTA
python 调用HBase的简单实例
2016/12/18 Python
Python解惑之整数比较详解
2017/04/24 Python
Python 3.6 性能测试框架Locust安装及使用方法(详解)
2017/10/11 Python
深入理解Python分布式爬虫原理
2017/11/23 Python
对python 操作solr索引数据的实例详解
2018/12/07 Python
python3.6使用urllib完成下载的实例
2018/12/19 Python
python日期相关操作实例小结
2019/06/24 Python
python3 中的字符串(单引号、双引号、三引号)以及字符串与数字的运算
2019/07/18 Python
Django对models里的objects的使用详解
2019/08/17 Python
python构建指数平滑预测模型示例
2019/11/21 Python
Python urlopen()和urlretrieve()用法解析
2020/01/07 Python
python GUI库图形界面开发之PyQt5信号与槽基础使用方法与实例
2020/03/06 Python
Python+Dlib+Opencv实现人脸采集并表情判别功能的代码
2020/07/01 Python
python爬取代理ip的示例
2020/12/18 Python
纯CSS3代码实现文字描边
2016/04/25 HTML / CSS
使用html5实现表格实现标题合并的实例代码
2019/05/13 HTML / CSS
荷兰DOD药房中文官网:DeOnlineDrogist
2020/12/27 全球购物
开学典礼策划方案
2014/05/28 职场文书
安全生产感想
2015/08/07 职场文书
JS前端使用canvas实现物体的点选示例
2022/08/05 Javascript