JavaScript中的this基本问题实例小结


Posted in Javascript onMarch 09, 2020

本文实例讲述了JavaScript中的this基本问题.分享给大家供大家参考,具体如下:

在函数中 this 到底取何值,是在函数真正被调用执行的时候确定下来的,函数定义的时候确定不了。

执行上下文环境 :

 **定义**:执行函数的时候,会产生一个上下文的对象,里面保存变量,函数声明和this。

 **作用**:用来保存本次运行时所需要的数据

当你在代码中使用了 this,这个 this 的值就直接从执行的上下文中获取了,而不会从作用域链中搜寻。

关于 this 的取值,大体上可以分为以下几种情况:

情况一:全局 & 调用普通函数

在全局环境中,this 永远指向 window。

console.log(this === window);   //true

普通函数在调用时候(注意不是构造函数,前面不加 new),其中的 this 也是指向 window。

但是如果在严格模式下调用的话会报错:

var x = 1;
function first(){
  console.log(this);   // undefined
  console.log(this.x);  // Uncaught TypeError: Cannot read property 'x' of undefined
}
first();

情况二:构造函数

所谓的构造函数就是由一个函数 new 出来的对象,一般构造函数的函数名首字母大写,例如像 Object,Function,Array 这些都属于构造函数。

function First(){
  this.x = 1;
  console.log(this);  //First {x:1}
}
var first = new First();
console.log(first.x);   //1

上述代码,如果函数作为构造函数使用,那么其中的 this 就代表它即将 new 出来的对象。

但是如果直接调用 First函数,而不是 new First(),那就变成情况1,这时候 First() 就变成普通函数。

function First(){
  this.x =1;
  console.log(this);  //Window
}
var first = First();
console.log(first.x);   //undefined

情况三:对象方法

如果函数作为对象的方法时,方法中的 this 指向该对象。

var obj = {
  x: 1,
  first: function () {
    console.log(this);    //Object
    console.log(this.x);   //1
  }
};
obj.first();

注意:若是在对象方法中定义函数,那么情况就不同了。

var obj = {
  x: 1,
  first: function () {
    function second(){
      console.log(this);   //Window
      console.log(this.x);  //undefined
    }
    second();
  }
}
obj.first();

可以这么理解:函数 second虽然是在 obj.first 内部定义的,但它仍然属于一个普通函数,this 仍指向 window。

在这里,如果想要调用上层作用域中的变量 obj.x,可以使用 self 缓存外部 this 变量。

var obj = {
  x:1,
  first: function () {
    var self = this;
    function second(){
      console.log(self);   //{x: 1}
      console.log(self.x);  //1
    }
    second();
  }
}
obj.first();

如果 first 函数不作为对象方法被调用:

var obj = {
  x: 1,
  first: function () {
    console.log(this);    //Window
    console.log(this.x);   //undefined
  }
};
var fn = obj.first;
fn();

obj.first 被赋值给一个全局变量,并没有作为 obj 的一个属性被调用,那么此时 this 的值是 window。

情况四:构造函数 prototype 属性

function First(){
  this.x = 1;
}
First.prototype.getX = function () {
  console.log(this);    //First {x: 1, getX: function}
  console.log(this.x);   //1
}
var first= new First();
first.getX();

在 First.prototype.getX 函数中,this 指向的first 对象。不仅仅如此,即便是在整个原型链中,this 代表的也是当前对象的值。

情况五:函数用 call

var obj = {
  x:1
}
function first(){
  console.log(this);   //{x: 1}
  console.log(this.x);  //1
}
first.call(obj);

当一个函数被 call调用时,this 的值就取传入的对象的值。

来源:知乎

链接:https://zhuanlan.zhihu.com/p/25294187?utm_source=com.youdao.note&utm_medium=social

感兴趣的朋友可以使用在线HTML/CSS/JavaScript前端代码调试运行工具:http://tools.3water.com/code/WebCodeRun测试上述代码运行效果。

更多关于JavaScript相关内容还可查看本站专题:《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
JavaScript Event学习第五章 高级事件注册模型
Feb 07 Javascript
Javascript Cookie读写删除操作的函数
Mar 02 Javascript
jquery remove方法应用详解
Nov 22 Javascript
Javascript中对象继承的实现小例
May 12 Javascript
Jquery实现select multiple左右添加和删除功能的简单实例
May 26 Javascript
SWFUpload多文件上传及文件个数限制的方法
May 31 Javascript
JS之相等操作符详解
Sep 13 Javascript
jQuery插件HighCharts绘制2D带有Legend的饼图效果示例【附demo源码下载】
Mar 10 Javascript
jQuery日程管理控件glDatePicker用法详解
Mar 29 jQuery
vue+vux实现移动端文件上传样式
Jul 28 Javascript
小程序获取周围IBeacon设备的方法
Oct 31 Javascript
基于JavaScript或jQuery实现网站夜间/高亮模式
May 30 jQuery
Nuxt页面级缓存的实现
Mar 09 #Javascript
JavaScript设计模式之门面模式原理与实现方法分析
Mar 09 #Javascript
微信小程序自定义纯净模态框(弹出框)的实例代码
Mar 09 #Javascript
前端深入理解Typescript泛型概念
Mar 09 #Javascript
js实现无缝轮播图效果
Mar 09 #Javascript
js实现无缝轮播图
Mar 09 #Javascript
基于vue+echarts 数据可视化大屏展示的方法示例
Mar 09 #Javascript
You might like
php数组添加与删除单元的常用函数实例分析
2015/02/16 PHP
一张表搞清楚php is_null、empty、isset的区别
2015/07/07 PHP
PHP函数引用返回的实例详解
2016/09/11 PHP
PHP+Redis链表解决高并发下商品超卖问题(实现原理及步骤)
2020/08/03 PHP
js 限制input只能输入数字、字母和汉字等等
2013/12/18 Javascript
多个jQuery版本共存的处理方案
2015/03/17 Javascript
js数组依据下标删除元素
2015/04/14 Javascript
JS组件Bootstrap实现图片轮播效果
2016/05/16 Javascript
jQuery实现带遮罩层效果的blockUI弹出层示例【附demo源码下载】
2016/09/14 Javascript
Angular2表单自定义验证器的实现
2016/10/19 Javascript
jQuery实现倒计时重新发送短信验证码功能示例
2017/01/12 Javascript
微信小程序Server端环境配置详解(SSL, Nginx HTTPS,TLS 1.2 升级)
2017/01/12 Javascript
详解webpack与SPA实践之开发环境搭建
2017/12/18 Javascript
vue 项目如何引入微信sdk接口的方法
2017/12/18 Javascript
[原创]jquery判断元素内容是否为空的方法
2018/05/04 jQuery
vue3.0 CLI - 2.5 - 了解组件的三维
2018/09/14 Javascript
layui固定下拉框的显示条数(有滚动条)的方法
2019/09/10 Javascript
JQuery常用选择器功能与用法实例分析
2019/12/23 jQuery
vuex入门最详细整理
2020/03/04 Javascript
[47:48]DOTA2上海特级锦标赛D组小组赛#2 Liquid VS VP第三局
2016/02/28 DOTA
[56:41]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 Newbee vs OG
2018/04/01 DOTA
python处理中文编码和判断编码示例
2014/02/26 Python
Flask框架的学习指南之制作简单blog系统
2016/11/20 Python
Python批量合并有合并单元格的Excel文件详解
2018/04/05 Python
删除python pandas.DataFrame 的多重index实例
2018/06/08 Python
python修改字典键(key)的方法
2019/08/05 Python
Python模拟FTP文件服务器的操作方法
2020/02/18 Python
如何使用python代码操作git代码
2020/02/29 Python
CSS3结构性伪类选择器九种写法
2012/04/18 HTML / CSS
船舶专业个人求职信范文
2014/01/02 职场文书
小学先进集体事迹材料
2014/05/31 职场文书
金融专业求职信
2014/08/05 职场文书
玩手机检讨书1000字
2014/10/20 职场文书
个人自荐书范文
2015/03/09 职场文书
励志语录:只有自己足够强大,才能不被别人践踏
2020/01/09 职场文书
Win11显卡控制面板打开显卡设置方法
2022/04/20 数码科技