JavaScript第四版阅读ing~(3)

第四章

4.1.3传递参数
ECMAScript中所有函数的参数都是按值传递的,就像从一个变量复制到另一个变量一样,引用值也是值嘛。
在局部作用域中修改对象而变化反映到全局时,不意味着参数是按照引用传递的。

这里看起来是按引用传递,但是函数的参数是按值传递。

function setName(obj){
    
    
	obj.name = "Nicholas"
}
let person = new Object()
setName(person)
console.log(person.name)// "Nicholas"

详细例子:函数的传参就是复制了一份到里面。new Object()时候obj就开始指向new Object()这个地址了,外面的person是不受影响的。

function setName(obj){
    
    
    obj.name = "Nicholas"
    obj = new Object()
    obj.name = 'Greg'
}
let person = new Object()
setName(person)
console.log(person.name)// "Nicholas"

4.2.2变量声明
使用var声明变量时,变量自动添加到最接近的上下文,在函数中,最接近的上下文就是函数的局部上下文,如果变量未经声明就被初始化了,那么它会自动被添加到全局上下文中。

function add(num1, num2){
    
    
    var sum = num1 + num2
    return sum
}
let result = add(10, 20) //30
console.log(sum)// 报错

但是如果未声明sum,那么就可以访问到哦

function add(num1, num2){
    
    
    sum = num1 + num2
    return sum
}
let result = add(10, 20) //30
console.log(sum)// 30

4.3垃圾回收
主要使用以下两个:标记清除、引用计数
标记清除的做法:

  • 垃圾回收程序运行的时候,会标记内存中存储的所有变量(标记的方法有很多种),然后它会将所有在上下文中的变量,以及被在上下文中的变量引用的变量的标记去掉,在此之后再被加上标记的变量就待删除的了,随后垃圾回收程序做一次内存清理,销毁带标记的所有值并收回他们的内存。

引用计数的做法:
被引用加1,不被引用了-1,直到为0,就可以放心回收了。
但是如果被循环引用,就会导致一直不会释放,这也是引用计数的弊端。

4.3.4内存管理
优化内存占比的最佳手段就是保证在执行代码时只保存必要的数据。及时null释放内存。
提升性能的手段:

  1. 使用let和const :在块作用域比函数作用域更早终止这就有可能。
  2. 隐藏类和删除操作:隐藏类这里感觉就是共享一个构造函数和原型。

在这里插入图片描述
动态添加和动态删除(例如使用delete)都凑不太好。就不是相同的隐藏类了
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_46013619/article/details/110122743