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 相关文章推荐
扩展String功能方法
Sep 22 Javascript
IE Firefox 使用自定义标签的区别
Oct 15 Javascript
jQuery 第二课 操作包装集元素代码
Mar 14 Javascript
JavaScript调用Activex控件的事件的实现方法
Apr 11 Javascript
document.getElementById的简写方式(获取id对象的简略写法)
Sep 10 Javascript
jquery js 重置表单 reset()具体实现代码
Aug 05 Javascript
JavaScript将XML转成JSON的方法
Mar 12 Javascript
js代码实现下拉菜单【推荐】
Dec 15 Javascript
JavaScript实现三级联动菜单实例代码
Jun 26 Javascript
微信小程序注册60s倒计时功能 使用JS实现注册60s倒计时功能
Aug 16 Javascript
详解vue渲染函数render的使用
Dec 12 Javascript
react.js组件实现拖拽复制和可排序的示例代码
Aug 20 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中文本操作的类
2007/03/17 PHP
php一个找二层目录的小东东
2012/08/02 PHP
PHP防止图片盗用(盗链)的方法小结
2016/11/11 PHP
PHP实现读取文件夹及批量重命名文件操作示例
2019/04/15 PHP
Yii框架学习笔记之session与cookie简单操作示例
2019/04/30 PHP
javascript 解析后的xml对象的读取方法细解
2009/07/25 Javascript
Javascript 设计模式(二) 闭包
2010/05/26 Javascript
SWFObject 2.1以上版本语法介绍
2010/07/10 Javascript
javascript Array对象基础知识小结
2010/11/16 Javascript
当自定义数据属性为json格式字符串时jQuery的data api问题探讨
2013/02/18 Javascript
javascript中apply和call方法的作用及区别说明
2014/02/14 Javascript
JS获取文本框,下拉框,单选框的值的简单实例
2014/02/26 Javascript
jquery datepicker参数介绍和示例
2014/04/15 Javascript
Jquery 1.9.1源码分析系列(十二)之筛选操作
2015/12/02 Javascript
AngularJS基于ngInfiniteScroll实现下拉滚动加载的方法
2016/12/14 Javascript
Vue组件开发初探
2017/02/14 Javascript
基于input框覆盖掉数字英文的实例讲解
2017/07/21 Javascript
jQuery 获取除某指定对象外的其他对象 ( :not() 与.not())
2018/10/10 jQuery
浅谈js中的bind
2019/03/18 Javascript
微信小程序防止多次点击跳转(函数节流)
2019/09/19 Javascript
js实现盒子移动动画效果
2020/08/09 Javascript
Python中with及contextlib的用法详解
2017/06/08 Python
使用python将请求的requests headers参数格式化方法
2019/01/02 Python
Python中super函数用法实例分析
2019/03/18 Python
python shell命令行中import多层目录下的模块操作
2020/03/09 Python
如何对python的字典进行排序
2020/06/19 Python
THE OUTNET英国官网:国际设计师品牌折扣网站
2016/08/14 全球购物
雷朋巴西官方商店:Ray-Ban Brasil
2020/07/21 全球购物
JAVA代码查错题
2014/10/10 面试题
武汉高蓝德国际.net机试
2016/06/24 面试题
物业管理应届生求职信
2013/10/28 职场文书
大学生村官事迹材料
2014/01/21 职场文书
2014年高数考试作弊检讨书
2014/12/14 职场文书
2015年教师节贺卡寄语
2015/03/24 职场文书
2015年教研工作总结
2015/05/23 职场文书
Nginx 反向代理解决跨域问题多种情况分析
2022/01/18 Servers