我的编程空间,编程开发者的网络收藏夹
学习永远不晚

JavaScript函数执行上下文的this怎么调用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

JavaScript函数执行上下文的this怎么调用

今天小编给大家分享一下JavaScript函数执行上下文的this怎么调用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

    JavaScript 中的 this 是什么

    关于 this,我们得先从执行上下文说起。我们知道:执行上下文中包含了变量环境、词法环境、外部环境,当然也包括 this,具体你可以参考下图:

    JavaScript函数执行上下文的this怎么调用

    从图中可以看出,this 是和执行上下文绑定的,也就是说每个执行上下文中都有一个 this。执行上下文主要分为三种——全局执行上下文、函数执行上下文和 eval 执行上下文,所以对应的 this 也只有这三种——全局执行上下文中的 this、函数中的 this 和 eval 中的 this。

    不过由于 eval 我们使用的不多,所以本文我们对此就不做介绍了,如果你感兴趣的话,可以自行搜索和学习相关知识。

    那么接下来我们就重点讲解下全局执行上下文中的 this和函数执行上下文中的 this。

    全局执行上下文中的 this

    首先我们来看看全局执行上下文中的 this 是什么。

    你可以在控制台中输入console.log(this)来打印出来全局执行上下文中的 this,最终输出的是 window 对象。所以你可以得出这样一个结论:全局执行上下文中的 this 是指向 window 对象的。这也是 this 和作用域链的唯一交点,作用域链的最底端包含了 window 对象,全局执行上下文中的 this 也是指向 window 对象。

    函数执行上下文中的 this

    现在你已经知道全局对象中的 this 是指向 window 对象了,那么接下来,我们就来重点分析函数执行上下文中的 this。还是先看下面这段代码:

    function foo() {  console.log(this);}foo();

    我们在 foo 函数内部打印出来 this 值,执行这段代码,打印出来的也是 window 对象,这说明在默认情况下调用一个函数,其执行上下文中的 this 也是指向 window 对象的。估计你会好奇,那能不能设置执行上下文中的 this 来指向其他对象呢?答案是肯定的。通常情况下,有下面三种方式来设置函数执行上下文中的 this 值。

    1. 通过函数的 call 方法设置

    你可以通过函数的call方法来设置函数执行上下文的 this 指向,比如下面这段代码,我们就并没有直接调用 foo 函数,而是调用了 foo 的 call 方法,并将 bar 对象作为 call 方法的参数。

    let bar = {  myName: " name1 ",  test1: 1,};function foo() {  this.myName = " name2 ";}foo.call(bar);console.log(bar);console.log(myName);

    执行这段代码,然后观察输出结果,你就能发现 foo 函数内部的 this 已经指向了 bar 对象,因为通过打印 bar 对象,可以看出 bar 的 myName 属性已经由“name1”变为“name2”了,同时在全局执行上下文中打印 myName,JavaScript 引擎提示该变量未定义。

    其实除了 call 方法,你还可以使用bind和apply方法来设置函数执行上下文中的 this,仅仅是语法稍有不同。

    2. 通过对象调用方法设置

    要改变函数执行上下文中的 this 指向,除了通过函数的 call 方法来实现外,还可以通过对象调用的方式,比如下面这段代码:

    var myObj = {  name: " name ",  showThis: function () {    console.log(this);  },};myObj.showThis();

    在这段代码中,我们定义了一个 myObj 对象,该对象是由一个 name 属性和一个 showThis 方法组成的,然后再通过 myObj 对象来调用 showThis 方法。执行这段代码,你可以看到,最终输出的 this 值是指向 myObj 的。

    所以,你可以得出这样的结论:使用对象来调用其内部的一个方法,该方法的 this 是指向对象本身的。

    其实,你也可以认为 JavaScript 引擎在执行myObject.showThis()时,将其转化为了:

    myObj.showThis.call(myObj)

    接下来我们稍微改变下调用方式,把 showThis 赋给一个全局对象,然后再调用该对象,代码如下所示:

    var myObj = {  name: " time ",  showThis: function () {    this.name = " bang ";    console.log(this);  },};var foo = myObj.showThis;foo();

    执行这段代码,你会发现 this 又指向了全局 window 对象。

    所以通过以上两个例子的对比,你可以得出下面这样两个结论:

    • 在全局环境中调用一个函数,函数内部的 this 指向的是全局变量 window。

    • 通过一个对象来调用其内部的一个方法,该方法的执行上下文中的 this 指向对象本身。

    3. 通过构造函数中设置

    你可以像这样设置构造函数中的 this,如下面的示例代码:

    function CreateObj() {  this.name = " time ";}var myObj = new CreateObj();

    在这段代码中,我们使用 new 创建了对象 myObj,那你知道此时的构造函数 CreateObj 中的 this 到底指向了谁吗?

    其实,当执行 new CreateObj() 的时候,JavaScript 引擎做了如下四件事:

    • 首先创建了一个空对象 tempObj;

    • 接着调用 CreateObj.call 方法,并将 tempObj 作为 call 方法的参数,这样当 CreateObj 的执行上下文创建时,它的 this 就指向了 tempObj 对象;

    • 然后执行 CreateObj 函数,此时的 CreateObj 函数执行上下文中的 this 指向了 tempObj 对象;

    • 最后返回 tempObj 对象。

    这样,我们就通过 new 关键字构建好了一个新对象,并且构造函数中的 this 其实就是新对象本身。

    this 的设计缺陷以及应对方案

    就我个人而言,this 并不是一个很好的设计,因为它的很多使用方法都冲击人的直觉,在使用过程中存在着非常多的坑。下面咱们就来一起看看那些 this 设计缺陷。

    1. 嵌套函数中的 this 不会从外层函数中继承

    我认为这是一个严重的设计错误,并影响了很多开发者。

    至于如何解决?你可以在函数中声明一个变量 self 用来保存 this。当然也可以使用 ES6 中的箭头函数来解决这个问题。

    2. 普通函数中的 this 默认指向全局对象 window

    上面我们已经介绍过了,在默认情况下调用一个函数,其执行上下文中的 this 是默认指向全局对象 window 的。

    不过这个设计也是一种缺陷,因为在实际工作中,我们并不希望函数执行上下文中的 this 默认指向全局对象,因为这样会打破数据的边界,造成一些误操作。如果要让函数执行上下文中的 this 指向某个对象,最好的方式是通过 call 方法来显示调用。

    这个问题可以通过设置 JavaScript 的“严格模式”来解决。在严格模式下,默认执行一个函数,其函数的执行上下文中的 this 值是 undefined,这就解决上面的问题了。

    以上就是“JavaScript函数执行上下文的this怎么调用”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网行业资讯频道。

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    JavaScript函数执行上下文的this怎么调用

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档

    猜你喜欢

    JavaScript函数执行上下文的this怎么调用

    今天小编给大家分享一下JavaScript函数执行上下文的this怎么调用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Ja
    2023-07-04

    JavaScript执行上下文中的this怎么使用

    这篇文章主要讲解了“JavaScript执行上下文中的this怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript执行上下文中的this怎么使用”吧!前言在对象内部的方
    2023-07-05

    深入理解函数执行上下文this

    这篇文章主要为大家介绍了深入理解函数执行上下文this示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-13

    JavaScript 执行上下文的视角详解this使用

    这篇文章主要为以JavaScript 执行上下文的视角为大家讲清楚 this使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-27

    JavaScript怎么执行上下文

    这篇文章主要介绍了JavaScript怎么执行上下文,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、怎么描述执行上下文1.1 本节知识导图:1.2 如果描述执行上下文当函数
    2023-06-14

    JavaScript中执行上下文的原理是什么

    这期内容当中小编将会给大家带来有关JavaScript中执行上下文的原理是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。执行上下文执行上下文是当前代码的执行环境。执行上下文主要是三种类型:全局执行上下
    2023-06-15

    一文带你掌握JavaScript中的执行上下文和作用域

    作为一名前端工作人员,我们必须知道JavaScript内部是如何执行的。那对于执行上下文和作用域的理解至关重要,无论是工作还是面试都是无法跳跃的一步,本文就来带大家深入了解一下
    2023-02-08

    JavaScript立即执行函数的用法是什么

    JavaScript立即执行函数的用法是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。 我们知道,在一般情况下,函数必须先调用才能执行,如下所示,我们定义
    2023-06-22

    怎么用VBS可执行程序+Xmlhttp下载备份网上文件

    这篇文章主要介绍怎么用VBS可执行程序+Xmlhttp下载备份网上文件,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!今天写程序时突然想到做一个文件的备份,把网站上的数据库备份到本地机上。一个简单的小程序,做成可执行的
    2023-06-08

    C++两个cpp文件间怎么进行各自函数的调用

    本篇内容主要讲解“C++两个cpp文件间怎么进行各自函数的调用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++两个cpp文件间怎么进行各自函数的调用”吧!两个cpp文件间如何进行各自函数的调
    2023-07-05

    C++一个函数怎么调用其他.cpp文件中的函数

    本文小编为大家详细介绍“C++一个函数怎么调用其他.cpp文件中的函数”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++一个函数怎么调用其他.cpp文件中的函数”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一
    2023-07-05

    Java中的函数怎么利用匿名类进行回调

    今天就跟大家聊聊有关Java中的函数怎么利用匿名类进行回调,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。在C语言中,函数名可以当做函数指针传递给形参从而实现回调void f1() {
    2023-05-31

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录