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 相关文章推荐
js中substring和substr的详细介绍与用法
Aug 29 Javascript
通过js为元素添加多项样式,浏览器全兼容写法
Aug 30 Javascript
基于jQuery实现鼠标点击导航菜单水波动画效果附源码下载
Jan 06 Javascript
JavaScript继承模式粗探
Jan 12 Javascript
jstree的简单实例
Dec 01 Javascript
微信小程序-横向滑动scroll-view隐藏滚动条
Apr 20 Javascript
ReactNative之键盘Keyboard的弹出与消失示例
Jul 11 Javascript
vue-router相关基础知识及工作原理
Mar 16 Javascript
详解Vue SSR( Vue2 + Koa2 + Webpack4)配置指南
Nov 13 Javascript
详解Vue中watch的详细用法
Nov 28 Javascript
jQuery实现当拉动滚动条到底部加载数据的方法分析
Jan 24 jQuery
微信小程序用户授权弹窗 拒绝时引导用户重新授权实现
Jul 29 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/11/26 PHP
PHP Warning: Module 'modulename' already loaded in问题解决办法
2015/03/16 PHP
php文件压缩之PHPZip类用法实例
2015/06/18 PHP
ThinkPHP实现递归无级分类――代码少
2015/07/29 PHP
简单PHP会话(session)说明介绍
2016/08/21 PHP
PHP中散列密码的安全性分析
2019/07/26 PHP
JavaScript面向对象之体会[总结]
2008/11/13 Javascript
JS 表单验证大全
2011/11/23 Javascript
使用js在页面中绘制表格核心代码
2013/09/16 Javascript
javascript常用函数归纳整理
2014/10/31 Javascript
JavaScript中Date.toSource()方法的使用教程
2015/06/12 Javascript
JavaScript文档碎片操作实例分析
2015/12/12 Javascript
JS实现1000以内被3或5整除的数字之和
2016/02/18 Javascript
详解javascript跨浏览器事件处理程序
2016/03/27 Javascript
BootStrap入门教程(二)之固定的内置样式
2016/09/19 Javascript
JavaScript中const、var和let区别浅析
2016/10/11 Javascript
JS实现的加减乘除四则运算计算器示例
2017/08/09 Javascript
JavaScript基础心法 深浅拷贝(浅拷贝和深拷贝)
2018/03/05 Javascript
Vue触发式全局组件构建的方法
2018/11/28 Javascript
react项目如何使用iconfont的方法步骤
2019/03/13 Javascript
微信小程序之下拉列表实现方法解析(附完整源码)
2019/08/23 Javascript
VUE单页面切换动画代码(全网最好的切换效果)
2019/10/31 Javascript
JS监听组合按键思路及实现过程
2020/04/17 Javascript
python超简单解决约瑟夫环问题
2015/05/12 Python
Python 支付整合开发包的实现
2019/01/23 Python
Linux下远程连接Jupyter+pyspark部署教程
2019/06/21 Python
在自动化中用python实现键盘操作的方法详解
2019/07/19 Python
基于numpy中的expand_dims函数用法
2019/12/18 Python
Numpy之reshape()使用详解
2019/12/26 Python
pytorch 数据处理:定义自己的数据集合实例
2019/12/31 Python
python为QT程序添加图标的方法详解
2020/03/09 Python
Python的控制结构之For、While、If循环问题
2020/06/30 Python
DataList 能否分页,请问如何实现?
2015/05/03 面试题
灰雀教学反思
2014/04/28 职场文书
综合素质评价思想道德自我评价
2015/03/09 职场文书
超越Nginx的Web服务器caddy优雅用法
2022/06/21 Servers