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 相关文章推荐
P3P Header解决Cookie跨域的问题
Mar 12 Javascript
JavaScript对内存分配及管理机制详细解析
Nov 11 Javascript
JavaScript中的函数声明和函数表达式区别浅析
Mar 27 Javascript
使用jquery给新生的th绑定hover事件的实例
Feb 10 Javascript
javascript设计模式之中介者模式学习笔记
Feb 15 Javascript
js实现移动端导航点击自动滑动效果
Jul 18 Javascript
微信小程序 input输入及动态设置按钮的实现
Oct 27 Javascript
浅谈在vue中用webpack打包之后运行文件的问题以及相关配置方法
Feb 21 Javascript
bootstrap模态框关闭后清除模态框的数据方法
Aug 10 Javascript
详解promise.then,process.nextTick, setTimeout 以及 setImmediate的执行顺序
Nov 21 Javascript
js回调函数仿360开机
Dec 26 Javascript
基于Vue sessionStorage实现保留搜索框搜索内容
Jun 01 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
ThinkPHP自动转义存储富文本编辑器内容导致读取出错的解决方法
2014/08/08 PHP
php将access数据库转换到mysql数据库的方法
2014/12/24 PHP
PHP面向对象之事务脚本模式(详解)
2017/06/07 PHP
轻轻松松学习JavaScript
2007/02/25 Javascript
javascript event 事件解析
2011/01/31 Javascript
jQuery实现鼠标滑过Div层背景变颜色的方法
2015/02/17 Javascript
jquery实现的树形目录实例
2015/06/26 Javascript
js如何判断是否在iframe中及防止网页被别站用iframe嵌套
2017/01/11 Javascript
移动端Ionic App 资讯上下循环滚动的实现代码(跑马灯效果)
2017/08/29 Javascript
JavaScript面向对象精要(上部)
2017/09/12 Javascript
vue项目中引入noVNC远程桌面的方法
2018/03/05 Javascript
详解处理bootstrap4不支持远程静态框问题
2018/07/20 Javascript
解决vue 绑定对象内点击事件失效问题
2018/09/05 Javascript
Vue.js 使用v-cloak后仍显示变量的解决方法
2018/11/19 Javascript
Vue  webpack 项目自动打包压缩成zip文件的方法
2019/07/24 Javascript
[51:14]LGD vs VP 2018国际邀请赛淘汰赛BO3 第一场 8.21
2018/08/22 DOTA
Python urlopen()函数 示例分享
2014/06/12 Python
Python使用matplotlib绘制动画的方法
2015/05/20 Python
深入解析Python中函数的参数与作用域
2016/03/20 Python
python re模块findall()函数实例解析
2018/01/19 Python
Python 实现12306登录功能实例代码
2018/02/09 Python
python 判断字符串中是否含有汉字或非汉字的实例
2019/07/15 Python
django与vue的完美结合_实现前后端的分离开发之后在整合的方法
2019/08/12 Python
python设置表格边框的具体方法
2020/07/17 Python
使用CSS Grid布局实现网格的流动
2014/12/30 HTML / CSS
使用HTML和CSS实现的标签云效果(附demo)
2021/02/03 HTML / CSS
Columbia美国官网:美国著名的户外服装品牌
2016/11/24 全球购物
丝芙兰意大利官方网站:Sephora.it
2019/12/13 全球购物
大学生旷课检讨书
2014/01/22 职场文书
综合实践活动方案
2014/02/14 职场文书
《庐山的云雾》教学反思
2014/04/22 职场文书
企业指导教师评语
2014/04/28 职场文书
星级党支部申报材料
2014/05/31 职场文书
2014年教师思想工作总结
2014/12/03 职场文书
宝葫芦的秘密观后感
2015/06/11 职场文书
MySQL数据库超时设置配置的方法实例
2021/10/15 MySQL