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 图片轮播(5张图片)
Dec 30 Javascript
JS中showModalDialog 的使用解析
Apr 17 Javascript
基于Bootstrap+jQuery.validate实现Form表单验证
Dec 16 Javascript
PHP结合jQuery实现的评论顶、踩功能
Jul 22 Javascript
微信小程序 保留小数(toFixed)详细介绍
Nov 16 Javascript
Node.js 的模块知识汇总
Aug 16 Javascript
mongoose设置unique不生效问题的解决及如何移除unique的限制
Nov 07 Javascript
JS实现匀速与减速缓慢运动的动画效果封装示例
Aug 27 Javascript
vue过滤器用法实例分析
Mar 15 Javascript
jQuery实现弹幕特效
Nov 29 jQuery
vue+vant实现商品列表批量倒计时功能
Jan 13 Javascript
解决removeEventListener 无法清除监听的问题
Oct 30 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
完美解决dedecms中的[html][/html]和[code][/code]问题
2007/03/20 PHP
php与paypal整合方法
2010/11/28 PHP
PHP中如何判断AJAX提交的数据
2012/02/05 PHP
PHP入门教程之正则表达式基本用法实例详解(正则匹配,搜索,分割等)
2016/09/11 PHP
Yii2框架实现注册和登录教程
2016/09/30 PHP
js类后台管理菜单类-MenuSwitch
2007/09/12 Javascript
Mootools 1.2教程 Fx.Morph、Fx选项和Fx事件
2009/09/15 Javascript
javascript 事件查询综合 推荐收藏
2010/03/10 Javascript
JavaScript中继承的一些示例方法与属性参考
2010/08/07 Javascript
javascript原生和jquery库实现iframe自适应高度和宽度
2014/07/18 Javascript
js+css实现文字散开重组动画特效代码分享
2015/08/21 Javascript
微信小程序 action-sheet底部菜单详解
2016/10/27 Javascript
js实现页面刷新滚动条位置不变
2016/11/27 Javascript
JS生成一维码(条形码)功能示例
2017/01/19 Javascript
ES6中Math对象的部分扩展
2017/02/20 Javascript
vue检测对象和数组的变化分析
2018/06/30 Javascript
JavaScript中变量、指针和引用功能与操作示例
2018/08/04 Javascript
JavaScript中创建原子的方法总结
2018/08/26 Javascript
vue2.0结合Element-ui实战案例
2019/03/06 Javascript
Swiper实现导航栏滚动效果
2020/10/16 Javascript
[54:57]DOTA2-DPC中国联赛定级赛 Aster vs DLG BO3第二场 1月8日
2021/03/11 DOTA
Python命令行解析模块详解
2018/02/01 Python
TensorFlow模型保存和提取的方法
2018/03/08 Python
influx+grafana自定义python采集数据和一些坑的总结
2018/09/17 Python
纯CSS实现设置半个字符的样式
2014/07/03 HTML / CSS
突袭HTML5之Javascript API扩展5—其他扩展(应用缓存/服务端消息/桌面通知)
2013/01/31 HTML / CSS
html5教程调用绘图api画简单的圆形代码分享
2013/12/04 HTML / CSS
戴森台湾线上商城:Dyson Taiwan
2018/05/21 全球购物
建筑专业自荐信
2013/10/18 职场文书
幼教求职信
2014/03/12 职场文书
2014离婚协议书范文两篇
2014/09/15 职场文书
离婚协议书的书写要求
2014/09/17 职场文书
党的群众路线教育实践活动个人剖析材料
2014/10/07 职场文书
端午节活动总结报告
2015/02/11 职场文书
2015年话务员工作总结
2015/04/29 职场文书
贫困证明书范文
2015/06/16 职场文书