深入理解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 相关文章推荐
回车直接实现点击某按钮的效果即触发单击事件
Feb 27 Javascript
jquery 为a标签绑定click事件示例代码
Jun 23 Javascript
JavaScript每天定时更换皮肤样式的方法
Jul 01 Javascript
深入浅析Bootstrap列表组组件
May 03 Javascript
vue2.0开发实践总结之疑难篇
Dec 07 Javascript
JS实现的样式切换功能tableCSS实例
Dec 30 Javascript
JavaScript在form表单中使用button按钮实现submit提交方法
Jan 23 Javascript
利用JQuery操作iframe父页面、子页面的元素和方法汇总
Sep 10 jQuery
JavaScript实现点击出现图片并统计点击次数功能示例
Jul 23 Javascript
如何测量vue应用运行时的性能
Jun 21 Javascript
Vue如何实现监听组件原生事件
Jul 03 Javascript
微信小程序实现身份证取景框拍摄
Sep 09 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
2020年4月放送决定!第2期TV动画《邪神酱飞踢》视觉图&主题曲情报公开!
2020/03/06 日漫
PHP转盘抽奖接口实例
2015/02/09 PHP
JQuery浮动DIV提示信息并自动隐藏的代码
2010/08/29 Javascript
javascript 文本框水印/占位符(watermark/placeholder)实现方法
2012/01/15 Javascript
js判断客户端是iOS还是Android等移动终端的方法
2013/12/11 Javascript
javascript复制粘贴与clipboardData的使用
2014/10/16 Javascript
JS数组排序技巧汇总(冒泡、sort、快速、希尔等排序)
2015/11/24 Javascript
JavaScript类型系统之正则表达式
2016/01/05 Javascript
JavaScript tab选项卡插件实例代码
2016/02/23 Javascript
浅谈JavaScript中的分支结构
2016/07/01 Javascript
js原生之焦点图转换加定时器实例
2016/12/12 Javascript
原生js验证简洁注册登录页面
2016/12/17 Javascript
基于jQuery制作小图标上下滑动特效
2017/01/18 Javascript
vue省市区三联动下拉选择组件的实现
2017/04/28 Javascript
Vue.js中数据绑定的语法教程
2017/06/02 Javascript
详解react-refetch的使用小例子
2019/02/15 Javascript
Vue 实现点击空白处隐藏某节点的三种方式(指令、普通、遮罩)
2019/10/23 Javascript
[57:22]完美世界DOTA2联赛PWL S2 FTD vs PXG 第二场 11.27
2020/12/01 DOTA
python执行shell获取硬件参数写入mysql的方法
2014/12/29 Python
老生常谈Python startswith()函数与endswith函数
2017/09/08 Python
对Python强大的可变参数传递机制详解
2019/06/13 Python
python实现得到当前登录用户信息的方法
2019/06/21 Python
Python绘制动态水球图过程详解
2020/06/03 Python
python代码能做成软件吗
2020/07/24 Python
python爬取豆瓣电影排行榜(requests)的示例代码
2021/02/18 Python
css3动画效果抖动解决方法
2018/09/03 HTML / CSS
将SVG图引入到HTML页面的实现
2019/09/20 HTML / CSS
印度在线杂货店:bigbasket
2018/08/23 全球购物
EMU Australia澳大利亚官网:澳大利亚本土雪地靴品牌
2019/07/24 全球购物
电子商务助理求职自荐信
2014/04/10 职场文书
优秀学生干部先进事迹材料
2014/05/26 职场文书
导游欢送词
2015/01/31 职场文书
2016年清明节网上祭英烈活动总结
2016/04/01 职场文书
golang 实现并发求和
2021/05/08 Golang
JavaScript高级程序设计之变量与作用域
2021/11/17 Javascript
MySQL学习之基础操作总结
2022/03/19 MySQL