当前位置:   article > 正文

JavaScript高级程序设计第四版--第四章--变量、作用域与内存_javascript高级程序设计第4版 pdf csdn

javascript高级程序设计第4版 pdf csdn

原始值与引用值

原始值:简单数据类型(通过new 出来的不是原始值)

引用值:复杂数据类型

动态属性

原始值:不能有属性,强制给原始值添加属性虽然不会报错,但是该操作是无效的

let n = 1;
n.length = 1;
console.log(n,n.length);

引用值:可以有属性,添加属性是有效的

复制值

原始值:将值拷贝

引用值:将引用拷贝

传递参数

原始值:值传递

引用值:引用传递

确定类型

原始值:typeof

引用值:instanceof,检查原型链上是否有构造函数

console.log(null instanceof Object) // false,因为null为简单数据类型,简单数据类型没有原型链

执行上下文与作用域

JavaScript 中的执行上下文是指在 JavaScript 代码中执行的环境,它包含了当前代码执行时所需的所有信息,如变量和函数的声明、this、作用域链等。执行上下文被创建时,JavaScript 引擎会为其创建一个作用域链,该作用域链被用于解析变量和函数

执行上下文

动态的,函数执行时的环境,不同的上下文会导致this的不同

每个上下文都有一个关联对象(无法通过代码访问),在上下文中定义的所有变量和函数都存放在该对象上

全局上下文

它是默认的上下文,位于代码的最外层,无论是在函数内部还是在全局作用域中都可以访问它。全局上下文始终是唯一的。

函数上下文

每当函数被调用时,就会创建新的上下文,这个上下文是这个函数所特有的,其生命周期只能在函数的执行过程中存在。每个函数都会有自己的函数上下文。

eval上下文

eval() 函数可以将传入的字符串当做 JavaScript 代码来执行。在eval() 函数执行时会创建一个新的上下文。

作用链

静态的,不同作用域决定了变量和函数的可见性和存活周期

全局作用域链

全局作用域链是最顶层的作用域链,包含全局对象。

在浏览器环境中,全局对象是 window 对象。

函数作用域链

每个函数在执行时都会创建自己的作用域链。

函数作用域链由当前函数的变量对象和其父级函数(定义时)的作用域链组成。

函数作用域链的末端通常是全局作用域链。

块级作用域链

块级作用域链是在 ES6 引入块级作用域后出现的概念。

块级作用域链由当前块级作用域的变量环境和其外部作用域链组成。

块级作用域链的末端通常是包含该块级作用域的函数或全局作用域链。

let t = 0;
function test0() {
  console.log(t)  // test0的作用域链:当前函数的变量对象和其**父级函数(定义时)**的作用域链组成。
}
function test() {
  let t = 1
  test0()
}
test()

垃圾回收

由执行环境在代码执行时管理内存,不同执行环境管理方式不同

基本思路确定哪个变量不会再使用,就释放其内存,这个过程是周期性的,每隔一定时间(或者说某个预定时间)自动执行。在 JavaScript 的垃圾回收过程中,通常会涉及到执行停止(即停止 JavaScript 代码的执行),但现代的垃圾回收器尽可能通过巧妙的策略来减少对代码执行的影响,以在给用户较好的交互体验的同时进行垃圾回收

当确定变量不再使用后,应该将变量赋值为null或undefined

标记清理

给所有变量加上删除标记,再将在上下文以及被上下文引用的变量去除删除标记,带有删除标记的变量会在下个回收阶段被回收

引用计数

记录被引用次数,当为0时,在下个回收阶段被回收

回收时机

基本上根据已分配对象的大小和数量来判断

性能优化

V8隐藏类

原理:V8在将解释后的JavaScript代码优化为实际的机器代码时会利用“隐藏类”。运行期间,v8会将创建的对象和隐藏类关联起来,以跟踪它们的属性和特征,能够共享隐藏类的对象性能更好。

拥有相同属性和方法的实例对象能够共享隐藏类,应避免对实例对象属性方法的动态修改

对象池

原理:如果有很多对象被初始化,然后大量超出作用域,浏览器会采取更加激进的方式调度垃圾回收

维护一个定长对象池,从中获取和归还对象,可以避免对象频繁的创建

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号