返回顶部
首页 > 资讯 > 前端开发 > JavaScript >JavaScript进阶知识点作用域详解
  • 786
分享到

JavaScript进阶知识点作用域详解

2024-04-02 19:04:59 786人浏览 八月长安
摘要

目录javascript进阶讲解一一、浏览器的内核1.常见的浏览器内核二、JavaScript引擎2.1.为什么需要JavaScript引擎?2.2.常见的JavaScript引擎三

JavaScript进阶讲解一

接下来,我会给大家讲解js中让人让人迷惑的知识点,比如: 作用域、函数、闭包、面向对象、ES新特性、事件循环、微任务、宏任务、内存管理、Promise、await、 asnyc、防抖、节流等等。

一、浏览器的内核

1.常见的浏览器内核

Gecko:早期被Netscape和Mozilla Firefox浏览器浏览器使用。 Trident:微软开发,被IE4~IE11浏览器使用。 WEBkit:苹果基于Khtml开发、开源的,用于Safari,Google Chrome之前也在使用。 Blink:是Webkit的一个分支,Google开发,目前应用于Google Chrome、Edge、Opera等。

二、JavaScript引擎

2.1.为什么需要JavaScript引擎?

高级的编程语言都是需要转成最终的机器指令来执行,我们编写的JavaScript无论你交给浏览器或者node执行,最后都是需要被CPU执行,但是CPU只认识自己的指令集,也就是所谓的机器语言,才能被CPU所执行,所以我们需要JavaScript引擎帮助我们将JavaScript代码翻译成CPU指令来执行。

2.2.常见的JavaScript引擎

SpiderMonkey、Chakra、JavaScriptCore、V8... 现使用最多的是v8引擎

三、V8引擎

3.1.官方定义

  • V8是用C ++编写的Google开源高性能JavaScript和WebAssembly引擎,它用于Chrome和node.js等。
  • 它实现ECMAScript和WebAssembly,并在windows 7或更高版本,MacOS 10.12+和使用x64,IA-32, ARM或MIPS处理器的linux系统上运行。
  • V8可以独立运行,也可以嵌入到任何C ++应用程序中。

3.2.解析过程图示

四、JS的执行过程

  • 初始化全局对象(GO -》 Global Object): js引擎在执行代码之前,会在堆内存中创建一个全局对象,将window属性指向自己,也会将Date、Array、String、Number、setTimeout、和你自己定义的全局变量这些放到GO中(当然你自己定义的还未执行 所以值是underfind)(这也是为什么我们可以使用window.及Data这些函数或类的原因)
  • 执行上下文栈(ECS -》Execution Context Stack): 它是用于执行代码的调用栈,执行的是全局的代码块(GEC -》 Global Execution Context),也就是说GEC 会被放到ECS中执行
  • GEC(这里面就有VO,这里指向GO)被放入到ECS中
  • GEC开始执行代码(从上往下依次执行)

4.1 普通代码执行

其实在GEC开始执行代码后 如果只是一些变量,还是很好理解的,比如

console.log(a); // undefined
var a = 100

这里为什么不报错 而是undefined,其实我们上面已将说的很明白了,因为在创建GO对象的时候 我们定义的全局变量会被添加到GO中 且值是undefined。这也是var的作用域提升。

4.1 函数如何执行?

如果我们执行时遇到函数怎么办呢?

foo()
function foo() {
  console.log(100);
}
// foo()

看上面函数 不论我们foo在哪里调用 他都是可以正确执行的。而不会和变量那样显示 undefined或者报错,这是为什么呢? 其实在GO创建时(编译时,代码还未开始执行),当他遇到有函数的定义时,就会根据函数体创建一个函数执行上下文(FEC,在这里也会有个VO,这里的VO指向AO)并且压入到ESC中,存的是一个内存地址,不在是undefined。 所以当代码开始执行时 执行到foo()时,他就能在GO中找到那个内存地址

五、作用域提升理解undefined

var n = 100
function foo() {
   n = 200
}
foo()
console.log(n); // 200
var n = 100
function foo() {
  console.log(n); // undefined
  return
  var n = 200
 }
 foo()

第一个大家应该都知道,所以不赘述,我们主要来看看为什么第二个打印的是undefined。看下图可得,在编译时,我们的函数会指向一个内存地址,开辟一个空间(AO),所以代码执行时,他会在AO中查找,找不到会在上一级查找(作用域链)

function foo() {
      console.log(a);// undefined
      var a = 100
      console.log(a);// 100
    }
    var a = 100
    foo()
function foo() {
      console.log(a);// 100
    }
    var a = 100
    foo()

我们在来看这两个,相信大家已经明白了第一个输出的原因,我们再来看看第二个为什么是100,而不是undefined,其实这个原因很简单,他就是作用域链,很明显我们的AO中没有a的定义,所以他会在上一层中找, 而这里的上一层就是GO,此时GO中的a已经是100了 所以找到的a就是100。

大家来思考下下面这个会是什么呢?

var a = 1
    function foo1() {
      console.log(a);
    }
    function foo2() {
      var a = 2
      console.log(a);
      foo1()
    }
    foo2()
    console.log(a);

到此这篇关于JavaScript进阶讲解一作用域的文章就介绍到这了,更多相关js作用域内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: JavaScript进阶知识点作用域详解

本文链接: https://lsjlt.com/news/149157.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • JavaScript进阶知识点作用域详解
    目录JavaScript进阶讲解一一、浏览器的内核1.常见的浏览器内核二、JavaScript引擎2.1.为什么需要JavaScript引擎?2.2.常见的JavaScript引擎三...
    99+
    2024-04-02
  • JavaScript进阶之函数和对象知识点详解
    目录JavaScript函数基本构造调用函数方法函数参数argument和rest代码调试变量的作用域函数体内变量作用域解释良好的变量定义格式全局变量局部变量常量Const方法的定义...
    99+
    2024-04-02
  • 详解Java进阶知识注解
    目录一、注解的概念1、注解官方解释2、注解与注释的区别二、内置注解与元注解1、常用的内置注解2、常用的元注解三、自定义注解1、自定义注解基础知识2、演示自定义注解的使用3、演示注解在...
    99+
    2024-04-02
  • javascript知识点详解
    目录一.JavaScript基本介绍二、Javascript基础语法三、JavaScript事件例子2:当点击div标签时,做一件事,如点击后弹出对话框。——用id类例子3:添加标签...
    99+
    2024-04-02
  • MYSQL进阶知识点有哪些
    这篇文章主要介绍MYSQL进阶知识点有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!文章目录1 前言1.1 数据库架构1.2 监控信息2 影响数据库的因素2.6.1 什么是事务2...
    99+
    2024-04-02
  • 超全的PHP进阶知识点
    目录 前文基础知识 static关键字 预定义常量 引号区别 字符串函数 数组进阶 函数进阶 变量作用域 类进阶 PHP超级全局变量 文件处理 文件属性获取 目录操作 正则表达式 phpstorm报错解决 前文基础知识 超详细的PHP入...
    99+
    2023-09-02
    php 开发语言
  • MySQL进阶之体系结构知识点
    这篇文章将为大家详细讲解有关MySQL进阶之体系结构知识点,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。5 MySQL体系结构 下面我们选一些比较常用的存储引擎进行简单的...
    99+
    2024-04-02
  • vuex进阶知识点的示例分析
    这篇文章将为大家详细讲解有关vuex进阶知识点的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、 Gettercomputed:{   ge...
    99+
    2024-04-02
  • 详解Linux文件操作知识点
    文件操作的相关系统调用 创建 int creat(const char *filename, mode_t mode); 参数mode 指定新建文件的存取权限,它同umask 一起决定文件的最终权限(mode&umas...
    99+
    2022-06-04
    Linux 文件
  • 详解JavaScript作用域
    这篇文章主要介绍“详解JavaScript作用域”,在日常操作中,相信很多人在详解JavaScript作用域问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”详解JavaScri...
    99+
    2024-04-02
  • javascript作用域和作用域链详解
    目录一、javascript的作用域1、全局作用域2、局部作用域二、javascript的作用域链三、作用域链和优化四、改变作用域链1、with语法改变作用域链2、catch语法总结...
    99+
    2024-04-02
  • Javascript基础知识详解
    目录变量数据类型扩展点总结变量 基本语法 var age=10;//声明一个名称为age的变量,并且为它赋值,称为变量的初始化 var是一个JS关键字,用来声明...
    99+
    2024-04-02
  • 详解Java注解知识点
    目录一、注解是什么二、jdk支持的注解有哪些2.1 三种常用的注解:2.2 元注解三、注解实例四、总结一、注解是什么 Java 注解用于为 Java 代码提供元数据,看完这句话也许你...
    99+
    2024-04-02
  • 大数据之MYSQL进阶的知识点有哪些
    这篇文章主要介绍了大数据之MYSQL进阶的知识点有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。文章目录5 MySQL体系结构5.6.1...
    99+
    2024-04-02
  • javascript之函数进阶详解
    目录函数定义方式函数的调用(6种)this指向问题严格模式高阶函数闭包递归:函数里面调用自己,需要有结束条件函数定义方式 function fn(){}//命名函数 var ...
    99+
    2024-04-02
  • PHP函数及作用域的知识点有哪些
    这篇“PHP函数及作用域的知识点有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“PHP函数及作用域的知识点有哪些”文章吧...
    99+
    2023-06-30
  • Linux netfilter/iptables知识点详解
    Netfilter Netfilter是Linux内核中的一个数据包处理模块,它可以提供数据包的过滤、转发、地址转换NAT功能。Iptables是一个工具,可以用来在Netfilter中增加、修改、删除数据包处理规则...
    99+
    2022-06-03
    Linux netfilter iptables
  • MySQL索引知识点详解
    这篇文章主要讲解了“MySQL索引知识点详解”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL索引知识点详解”吧!普通索引创建索引这是最基本的索引,它...
    99+
    2024-04-02
  • 【知识点】python的__init__详解
    介绍__init__方法的作用 __init__ 方法是 Python 中面向对象编程中类的特殊方法,也称为构造方法,当创建一个类的实例时,__init__ 方法会自动调用。 它的主要作用是初始化实例的属性,在实例被创建后,你可以通过这...
    99+
    2023-09-02
    python Powered by 金山文档
  • JavaScript作用域与作用域链使用重点讲解
    作用域和作用域链方面的知识是JS的重点,去面试十个有八个都会问你这块的知识,所以说这块是特别特别的重要,下面我们好好理解一下作用域和作用域链到底是个什么: 先上一段代码: var a...
    99+
    2022-11-13
    JS作用域与作用域链 JS作用域 JS作用域链
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作