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中万恶的function实例分析
May 25 Javascript
学习js在线html(富文本,所见即所得)编辑器
Dec 18 Javascript
javascript检测页面是否缩放的小例子
May 16 Javascript
setTimeout函数兼容各主流浏览器运行执行效果实例
Jun 13 Javascript
浅析hasOwnProperty方法的应用
Nov 20 Javascript
页面按钮禁用与解除禁用的方法
Feb 19 Javascript
javascript设计模式之解释器模式详解
Jun 05 Javascript
详解JavaScript的另类写法
Apr 11 Javascript
javascript实现的图片预览功能
Mar 25 Javascript
集成vue到jquery/bootstrap项目的方法
Feb 10 jQuery
vue 右键菜单插件 简单、可扩展、样式自定义的右键菜单
Nov 29 Javascript
vue源码nextTick使用及原理解析
Aug 13 Javascript
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产生随机数的两种方法实例代码 输出随机IP
2011/04/08 PHP
php数组函数序列之array_splice() - 在数组任意位置插入元素
2011/11/07 PHP
php 字符串压缩方法比较示例
2014/01/23 PHP
PHP内核探索之变量
2015/12/22 PHP
PHP获取二维数组中某一列的值集合
2015/12/25 PHP
jQuery的attr与prop使用介绍
2013/10/10 Javascript
使用 Node.js 做 Function Test实现方法
2013/10/25 Javascript
Flex通过JS获取客户端IP和计算机名的实例代码
2013/11/21 Javascript
使用Chart.js图表库制作漂亮的响应式表单
2015/10/28 Javascript
基于Bootstrap的后台管理面板 Bootstrap Metro Dashboard
2016/06/17 Javascript
通过学习bootstrop导航条学会修改bootstrop颜色基调
2017/06/11 Javascript
Angular5中提取公共组件之radio list的实例代码
2018/07/10 Javascript
vue-router权限控制(简单方式)
2018/10/29 Javascript
jQuery无冲突模式详解
2019/01/17 jQuery
Layui Form 自定义验证的实例代码
2019/09/14 Javascript
基于vue-cli3和element实现登陆页面
2019/11/13 Javascript
JS实现放烟花效果
2020/03/10 Javascript
Python基础教程之内置函数locals()和globals()用法分析
2018/03/16 Python
django反向解析URL和URL命名空间的方法
2018/06/05 Python
Python3编码问题 Unicode utf-8 bytes互转方法
2018/10/26 Python
pyqt5 QScrollArea设置在自定义侧(任何位置)
2019/09/25 Python
Python函数参数定义及传递方式解析
2020/06/10 Python
PyTorch 导数应用的使用教程
2020/08/31 Python
自定义html标记替换html5新增元素
2008/10/17 HTML / CSS
大一自我鉴定范文
2013/10/04 职场文书
应聘编辑职位自荐信范文
2014/01/05 职场文书
总经理任命书范本
2014/06/05 职场文书
自愿离婚协议书范本
2014/09/13 职场文书
2014年教师批评与自我批评思想汇报
2014/09/20 职场文书
2014年药店店长工作总结
2014/11/17 职场文书
社区艾滋病宣传活动总结
2015/05/07 职场文书
Python数据分析之pandas函数详解
2021/04/21 Python
Python使用UDP实现720p视频传输的操作
2021/04/24 Python
MySql学习笔记之事务隔离级别详解
2021/05/12 MySQL
详解解Django 多对多表关系的三种创建方式
2021/08/23 Python
Java数据结构之堆(优先队列)
2022/05/20 Java/Android