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 相关文章推荐
Prototype使用指南之base.js
Jan 10 Javascript
jQuery 联动日历实现代码
May 31 Javascript
js分解url参数(面向对象-极简主义法应用)
Aug 09 Javascript
jquery动画2.元素坐标动画效果(创建一个图片走廊)
Aug 24 Javascript
浅谈Node.js 子进程与应用场景
Jan 24 Javascript
Vue 实时监听窗口变化 windowresize的两种方法
Nov 06 Javascript
在vue项目中引入vue-beauty操作方法
Feb 11 Javascript
vue实现文字横向无缝走马灯组件效果的实例代码
Apr 09 Javascript
Node.js 多进程处理CPU密集任务的实现
May 26 Javascript
小程序如何构建骨架屏
May 29 Javascript
浅谈Webpack4 Tree Shaking 终极优化指南
Nov 18 Javascript
Vue组件跨层级获取组件操作
Jul 27 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
请离开include_once和require_once
2013/07/18 PHP
windows服务器中检测PHP SSL是否开启以及开启SSL的方法
2014/04/25 PHP
PHP支付系统设计与典型案例分享
2016/08/02 PHP
JS控件autocomplete 0.11演示及下载 1月5日已更新
2007/01/09 Javascript
JavaScript Archive Network 集合
2007/05/12 Javascript
jquery 缓存问题的几个解决方法
2013/11/11 Javascript
javascript事件冒泡详解和捕获、阻止方法
2014/04/12 Javascript
详解AngularJS中的作用域
2015/06/17 Javascript
干货分享:让你分分钟学会javascript闭包
2015/12/25 Javascript
使用bootstrap3开发响应式网站
2016/05/12 Javascript
vue下跨域设置的相关介绍
2017/08/26 Javascript
angularjs结合html5实现拖拽功能
2018/06/25 Javascript
详解基于React.js和Node.js的SSR实现方案
2019/03/21 Javascript
微信小程序与webview交互实现支付功能
2019/06/07 Javascript
[01:01:29]2018DOTA2亚洲邀请赛 4.4 淘汰赛 VP vs Liquid 第一场
2018/04/05 DOTA
[03:17]DOTA2-DPC中国联赛1月29日Recap集锦
2021/03/11 DOTA
Python递归遍历列表及输出的实现方法
2015/05/19 Python
python解析xml文件实例分析
2015/05/27 Python
Selenium(Python web测试工具)基本用法详解
2018/08/10 Python
CentOS 7 安装python3.7.1的方法及注意事项
2018/11/01 Python
解决nohup执行python程序log文件写入不及时的问题
2019/01/14 Python
python日期相关操作实例小结
2019/06/24 Python
Python3.7 读取音频根据文件名生成脚本的代码
2020/04/07 Python
html5 乒乓球(碰撞检测)实例二
2013/07/25 HTML / CSS
跨域修改iframe页面内容详解
2019/10/31 HTML / CSS
Marriott中国:万豪国际酒店查询预订
2016/09/02 全球购物
PHP面试题大全
2015/10/16 面试题
商务考察邀请函范文
2014/01/21 职场文书
青年志愿者活动总结
2014/04/26 职场文书
服务承诺书怎么写
2014/05/24 职场文书
2014中学教师节广播稿
2014/09/10 职场文书
公司离职证明范本(5篇)
2014/09/17 职场文书
冰峪沟导游词
2015/02/09 职场文书
Windows10下安装MySQL8
2021/04/06 MySQL
用Python爬取英雄联盟的皮肤详细示例
2021/12/06 Python
十大最强奥特曼武器:怪兽战斗仪在榜,第五奥特之父只使用过一次
2022/03/18 日漫