js机制

# js机制

# 解释下变量提升

js是单线程语言,所以执行肯定是按顺序执行。但是并不是逐行的分析和执行,而是一段一段地分析执行,会先进行编译阶段然后才是执行阶段。在编译阶段阶段,代码真正执行前的几毫秒,会检测到所有的变量和函数声明,所有这些函数和变量声明都被添加到名为Lexical Environment的js数据结构内的内存中。所以这些变量和函数能在它们真正被声明之前使用。

总结

  • js会将变量的声明提升到js顶部执行,对于var a = 2这种语句,会拆分开,将var a这步进行提升。

  • 变量提升的本质其实是js引擎在编译的时候,就将所有的变量声明了,因此在执行的时候,所有的变量都已经完成声明。

  • 当有多个同名变量的时候,函数声明会覆盖其他的声明。如果有多个函数声明,则由最后一个函数声明覆盖之前的所有声明。

# ⼀段js代码是如何执⾏的

js 的执行机制:先编译,再执行

经过编译后,会生成两部分内容:执行上下文(Execution context)和可执行代码

# 执行上下文

执行上下文是 JavaScript 执行一段代码时的运行环境,比如调用一个函数,就会进入这个函数的执行上下文,确定该函数在执行期间用到的诸如 this、变量、对象以及函数等,在执行上下文中存在一个变量环境的对象(Viriable Environment)这样就生成了变量环境对象。接下来 JavaScript 引擎会把声明以外的代码编译为字节码

执行上下文 由变量环境、词法环境、可执行代码环境组成,在每个执行上下文的变量环境中,都包含了一个外部引用,用来指向外部的执行上下文,我们把这个外部引用称为 outer。

# js的作⽤域链理解吗

定义:作用域的集合就是作用域链:全局作用域、函数作用域、块级作用域。

1、函数在执行的过程中,先从自己内部寻找变量

2、如果找不到,再从创建当前函数所在的作用域去找,从此往上,也就是向上一级找。 当在作用域内访问 变量/方法 的时候,会找离自己最近的那个 变量/方法 (就近原则)

# 谈⼀谈你对this的了解

函数的 this 关键字在 JavaScript 中的表现略有不同,此外,在严格模式和非严格模式之间也会有一些差别

在绝大多数情况下,函数的调用方式决定了 this 的值(运行时绑定)

this 关键字是函数运行时自动生成的一个内部对象,只能在函数内部使用,总指向调用它的对象

# 箭头函数的this指向哪⾥

  • 箭头函数没有自己的this, 它的this是继承而来; 默认指向在定义它时所处的对象(宿主对象)

  • 箭头函数根本没有自己的this,导致内部的this就是外层代码块的this。

# 理解闭包吗

在一个外函数中定义了一个内函数,内函数里使用了外函数的临时变量,并且外函数的返回值是内函数的引用。这样就构成一个闭包。一般情况下,在我们认知当中,如果一个函数结束,函数的内部所有东西都会释放掉,还给内存,局部变量都会消失。但是闭包是一种特殊情况,如果外函数在结束的时候发现有自己的临时变量将来会在内部函数中用到,就把这个临时变量绑定给了内部函数,然后自己再结束。经常用闭包来实现面向对象编程。

优点:

  1. 不会造成全局变量的污染;
  2. 可以在函数的外部访问到函数内部的局部变量(实现所谓的变量‘公有化’)。
  3. 让这些变量始终保存在内存中,不会随着函数的结束而自动销毁。

缺点:

  1. 闭包导致作用域链的不释放,会造成内存溢出,所以就会占用内存空间
Last Updated: 2022/10/10 06:36:14