深入理解javascript中的 “this”


Posted in Javascript onJanuary 17, 2017

一、前言:

我们知道 “this” 是javascript语言的一个关键字,在编写javascript代码的时候,经常会见到或者用到它。

但是,有一部分开发朋友,对 “this” 一知半解,下面我们就一起来探讨学习下javascript中 “this” 的具体含义吧!

二、This总结:

This指针作用域:

1)、在全局执行环境中使用this,表示Global对象,在浏览器中就是window对象。

2)、当在函数执行环境中使用this时,情况就有些复杂了。如果函数没有明显的作为非window对象的属性,而只是定义了函数,不管这个函数是不是定义在另一个函数中,这个函数中的this仍然表示window对象。如果函数显示地作为一个非window对象的属性,那么函数中的this就代表这个对象。

3)、当通过new运算符来调用函数时,函数被当做一个构造函数,this指向构造函数创建出来的对象。

三、各种情形下的DEMO:(当然,你也可以按照自己的想法来做各种测试...)

#在全局执行环境中使用this,表示Global对象,在浏览器中就是window对象

console.log(this); //Window
console.log(typeof this); //object
console.log(this === window); //true

##在函数执行环境中使用this时,如果函数没有明显的作为非window对象的属性,而只是定义了函数,不管这个函数是不是定义在另一个函数中,这个函数中的this仍然表示window对象

function A(){
 //在A函数中定义一个B函数
 function B(){
  console.log(this); //Window
  console.log(typeof this); //object
  console.log(this === window); //true
 }
 //在A函数内部调用B函数
 B();
}
//调用A函数
A();

###在函数执行环境中使用this时,如果函数显式地作为一个非window对象的属性,那么函数中的this就代表这个对象

//定义一个对象obj,并为她添加属性name,添加方法objFun
var obj = {
 name: '敲代码的怪蜀黍',
 objFun: function(){
  console.log(this); // Object {name: "敲代码的怪蜀黍"}
  console.log(typeof this); //object
  console.log(this === window); //false
  console.log(this.name); //敲代码的怪蜀黍
 }
}; 
//调用obj对象的方法
obj.objFun(); //this 绑定到当前对象,也就是obj对象

把上面的代码稍微改一下:

//定义一个对象obj,并为她添加属性name,添加方法objFun
var obj = {
 name: '敲代码的怪蜀黍',
 objFun: function(){
  console.log(this); //window
  console.log(typeof this); //object
  console.log(this === window); //true
  console.log('为了看效果而.'+this.name+'.已'); //为了看效果而..已
 }
};
var test = obj.objFun;
test();

这时候,你会神奇的发现,上面例子中的 this 又等于 window 了,到底是什么原因导致的呢?下面我们来分析分析:

我们首先要知道 “函数内部this的值不是静态的”,每次你调用一个函数它总是重新求值(但这一过程发生在函数代码实际执行之前),函数内部的this值实际上是由函数被调用的父作用域提供,更重要的是,她依赖实际函数的语法。

当函数被调用时,我们看紧邻括号“()”的左边。如果在括号的左侧存在一个引用,传递给调用函数的“this”值是引用所属于的那个对象,否则this的值就是全局对象。

我们再接着看看上面的例子,“var test = obj.objFun;” 这里表示没有调用函数,不用管。“test();”这里调用了函数,我们发现在括号“()”的左侧是一个变量test,test不是一个对象的引用,所以this的值就是全局对象。接下来,为了更深刻的理解上面的原理,我们来个更为复杂点的例子:

var name = 'window在手,天下我有!';
var obj = {
 name: '敲代码的怪蜀黍',
 objBar: {
  name: 'BOBO',
  barFun: function(){
   console.log(this.name);
  }
 }
};
//()左侧是barFun引用,它指向objBar对象,所以打印出 “BOBO”
var test1 = obj.objBar.barFun(); //BOBO
//()左侧是test2,test2它并不是某个对象的引用,所以打印出 “window在手,天下我有!”
var test2 = obj.objBar.barFun;
test2(); //window在手,天下我有!
//下面这个看起来复杂,其实抓住一点就行了:()左侧是testBar,testBar并不属于某个对象的引用,当然打印出来的还是 “window在手,天下我有!”
var test3 = obj.objBar;
var testBar = test3.barFun;
testBar(); //window在手,天下我有!

####当通过new运算符来调用函数时,函数被当做一个构造函数,this指向构造函数创建出来的对象

var name = 'window在手,天下我有!';
function A(){
 console.log(this.name);
}
A(); //window在手,天下我有! 
var objA = new A(); //undefined (因为objA并没有name属性)

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
location.href 在IE6中不跳转的解决方法与推荐使用代码
Jul 08 Javascript
Javascript图像处理思路及实现代码
Dec 25 Javascript
深入解析contentWindow, contentDocument
Jul 04 Javascript
jquery 删除字符串最后一个字符的方法解析
Feb 11 Javascript
JavaScript中数组成员的添加、删除介绍
Dec 30 Javascript
jQuery+php实时获取及响应文本框输入内容的方法
May 24 Javascript
浅谈angular2的http请求返回结果的subcribe注意事项
Mar 01 Javascript
详解vue与后端数据交互(ajax):vue-resource
Mar 16 Javascript
2种在vue项目中使用百度地图的简单方法
Sep 28 Javascript
JavaScript中BOM对象原理与用法分析
Jul 09 Javascript
JS数据类型(基本数据类型、引用数据类型)及堆和栈的区别分析
Mar 04 Javascript
详解JavaScript 的执行机制
Sep 18 Javascript
JavaScript正则表达式exec/g实现多次循环用法示例
Jan 17 #Javascript
Javascript设计模式之装饰者模式详解篇
Jan 17 #Javascript
微信小程序图表插件(wx-charts)实例代码
Jan 17 #Javascript
jQuery图片拖动组件Dropzone用法示例
Jan 17 #Javascript
js生成随机数方法和实例
Jan 17 #Javascript
jQuery表单插件ajaxForm实例详解
Jan 17 #Javascript
js实现手机拍照上传功能
Jan 17 #Javascript
You might like
强烈推荐:php.ini中文版(1)
2006/10/09 PHP
php输入数据统一类实例
2015/02/23 PHP
PHP传值到不同页面的三种常见方式及php和html之间传值问题
2015/11/19 PHP
PHP常用工具类大全附全部代码下载
2015/12/07 PHP
PDO::inTransaction讲解
2019/01/28 PHP
PHP实现获取文件mime类型多种方法解析
2020/05/28 PHP
关于js datetime的那点事
2011/11/15 Javascript
javascript小数四舍五入多种方法实现
2012/12/23 Javascript
div模拟选择框示例代码
2013/11/03 Javascript
Js为表单动态添加节点内容的方法
2015/02/10 Javascript
轻量级的原生js日历插件calendar.js使用指南
2015/04/28 Javascript
JavaScript中数组继承的简单示例
2015/07/29 Javascript
基于jQuery Circlr插件实现产品图片360度旋转
2015/09/20 Javascript
jquery插件pagination实现无刷新ajax分页
2015/09/30 Javascript
jqGrid中文文档之选项设置
2015/12/02 Javascript
微信小程序 获取微信OpenId详解及实例代码
2016/10/31 Javascript
详解JS中的快速排序与冒泡
2017/01/10 Javascript
JS实现的数字格式化功能示例
2017/02/10 Javascript
JS实现身份证输入框的输入效果
2017/08/21 Javascript
Vue结合Video.js播放m3u8视频流的方法示例
2018/05/04 Javascript
JavaScript实现点击出现图片并统计点击次数功能示例
2018/07/23 Javascript
JQuery中queue方法用法示例
2019/01/31 jQuery
[58:42]DOTA2上海特级锦标赛C组败者赛 Newbee VS Archon第一局
2016/02/27 DOTA
[02:36]DOTA2亚洲邀请赛小组赛精彩集锦:EE凭借法力虚空拿下4杀
2017/03/30 DOTA
python的常见命令注入威胁
2013/02/18 Python
python实现多线程的两种方式
2016/05/22 Python
Python读取Pickle文件信息并计算与当前时间间隔的方法分析
2019/01/30 Python
Django框架文件上传与自定义图片上传路径、上传文件名操作分析
2019/05/10 Python
Python项目跨域问题解决方案
2020/06/22 Python
升学宴答谢词
2015/01/05 职场文书
音乐会主持人开场白
2015/05/28 职场文书
傲慢与偏见读书笔记
2015/06/29 职场文书
css3 filter属性的使用简介
2021/03/31 HTML / CSS
解决Nginx 配置 proxy_pass 后 返回404问题
2021/03/31 Servers
vue.js 使用原生js实现轮播图
2022/04/26 Vue.js
Windows Server 2022 超融合部署(图文教程)
2022/06/25 Servers