深入理解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 相关文章推荐
js获取php变量的实现代码
Aug 10 Javascript
密码框显示提示文字jquery示例
Aug 29 Javascript
js控制页面的全屏展示和退出全屏显示的方法
Mar 10 Javascript
jQuery实现新消息闪烁标题提示的方法
Mar 11 Javascript
Vue.js每天必学之计算属性computed与$watch
Sep 05 Javascript
iframe高度自适应及隐藏滚动条的实例详解
Sep 29 Javascript
Vue的土著指令和自定义指令实例详解
Feb 04 Javascript
JavaScript实现区块链
Mar 14 Javascript
js中int和string数据类型互相转化实例
Jan 16 Javascript
js实现秒表计时器
Dec 16 Javascript
基于vue和websocket的多人在线聊天室
Feb 01 Javascript
JavaScript enum枚举类型定义及使用方法
May 15 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
调整优化您的LAMP应用程序的5种简单方法
2011/06/26 PHP
解析dedecms空间迁移步骤详解
2013/05/15 PHP
用jscript实现列出安装的软件列表
2007/06/18 Javascript
javascript 按回车键相应按钮提交事件
2009/11/02 Javascript
初试jQuery EasyUI 使用介绍
2010/04/01 Javascript
jquery.validate的使用说明介绍
2013/11/12 Javascript
自编jQuery插件实现模拟alert和confirm
2014/09/01 Javascript
浅析JavaScript声明变量
2015/12/21 Javascript
浅谈JS继承_寄生式继承 & 寄生组合式继承
2016/08/16 Javascript
浅谈JS中的!=、== 、!==、===的用法和区别
2016/09/24 Javascript
鼠标点击input,显示瞬间的边框颜色,对之修改与隐藏实例
2016/12/26 Javascript
JavaScript数据结构之二叉查找树的定义与表示方法
2017/04/12 Javascript
用 js 的 selection range 操作选择区域内容和图片
2017/04/18 Javascript
基于vue2框架的机器人自动回复mini-project实例代码
2017/06/13 Javascript
Angular2生命周期钩子函数的详细介绍
2017/07/10 Javascript
iview给radio按钮组件加点击事件的实例
2017/09/30 Javascript
小程序自定义单页面、全局导航栏的实现代码
2019/03/15 Javascript
vue使用自定义指令实现拖拽
2021/01/29 Javascript
[01:02:30]Mineski vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第三场 8.22
2019/09/05 DOTA
python基础教程之简单入门说明(变量和控制语言使用方法)
2014/03/25 Python
python中日期和时间格式化输出的方法小结
2015/03/19 Python
Python文件去除注释的方法
2015/05/25 Python
Windows上使用virtualenv搭建Python+Flask开发环境
2016/06/07 Python
Python解决走迷宫问题算法示例
2018/07/27 Python
Python 使用Opencv实现目标检测与识别的示例代码
2020/09/08 Python
浅谈HTML5 & CSS3的新交互特性
2016/07/19 HTML / CSS
计算机个人求职信范例
2014/01/24 职场文书
城市精细化管理实施方案
2014/03/04 职场文书
小学德育工作经验交流材料
2014/05/22 职场文书
欢迎词范文
2015/01/27 职场文书
趣味运动会广播稿
2015/08/19 职场文书
严以律己学习心得体会
2016/01/13 职场文书
MySQL中distinct和count(*)的使用方法比较
2021/05/26 MySQL
详解Python+OpenCV绘制灰度直方图
2022/03/22 Python
《LOL》“克隆大作战”久违归来 幻灵战队皮肤上线
2022/04/03 其他游戏
SQL解决未能删除约束问题drop constraint
2022/05/30 SQL Server