JS学习day1
作用域
- 作用域规定了变量能够被访问的“范围”,离开了这个范围变量便不能再被访问
作用域分为全局作用域和局部作用域
局部作用域
局部作用域又分为函数作用域和块作用域
-
函数作用域:在函数内部声明的变量只能在函数内部访问,外部无法直接访问
-
块作用域 :被{}包裹起来的区域称为块作用域,代码块声明的变量外部有可能无法访问
函数作用域
总结
1. 函数内部声明的变量,在函数外部无法访问
2. 函数的参数也是函数内部的局部变量
3. 不同函数内部声明的变量无法互相访问
4. 函数执行完毕后,函数内部的变量实际被清空了
块作用域
总结
- let声明的变量会产生块作用域,var不会产生块作用域
- const 声明的常量也会产生块作用域
- 不同代码块之间的变量无法相互访问
- 推荐使用let或const
注:开发中 let和 const 经常不加区分的使用,如果担心某个值会不小被修改时,则只能使用 const 声明成常量。
全局作用域
<script>标签和.js文件的最外层就是所谓的全局作用域,在此声明的变量在函数内部也可以被访问
作用域链
- 作用域链的本质是底层的变量查找机制
- 作用域链的查找规则:
> 会优先查找当前函数作用域的变量
> 查找不到则会依次逐级查找父级作用域直到全局作用域
JS垃圾回收机制
-
垃圾回收机制(Garbage Collection) 简称GC
JS中内存的分配和回收都是自动完成的,内存不使用的时候会被垃圾回收器自动回收 -
内存泄漏:不再用到的内存,没有及时释放,就叫做内存泄漏
-
内存的生命周期
内存分配、内存使用、内存回收
全局变量一般在页面关闭时才会回收;一般情况下局部变量的值,不用了,会被自动回收掉 -
垃圾回收算法:引用计数法和标记清除法(常用)
- IE采用的引用计数算法, 定义“内存不再使用”的标准很简单,就是看一个对象是否有指向它的引用。
算法:- 跟踪记录每个值被引用的次数。
- 如果这个值的被引用了一次,那么就记录次数1
- 多次引用会累加。
- 如果减少一个引用就减1。
- 如果引用次数是0 ,则释放内存。
引用计数法存在致命的问题嵌套引用
嵌套引用会导致内存泄漏- 标记清除法
- 核心思想:将"不再使用的对象"定义为"无法达到的对象"
- 就是从根部(在JS中就是全局对象)出发定时扫描内存中的对象。 凡是能从根部到达的对象,都是还需要使用的。
- 那些无法由根部出发触及到的对象被标记为不再使用,稍后进 行回收。
- IE采用的引用计数算法, 定义“内存不再使用”的标准很简单,就是看一个对象是否有指向它的引用。
闭包
- 概念:一个函数对周围状态的引用捆绑在一起,内层函数中访问到其外层函数的作用域
- 简单理解为 闭包 = 内层函数 + 外层函数的变量 - 作用: 封闭数据,可实现数据的私有,外部也可访问函数内部的变量
- 闭包可能引起的问题: 内存泄漏
函数进阶
动态参数
- 当不确定用户输入多少个参数时可使用动态参数
function fun(){
// 所有的实参都会传入arguments伪数组中,arguments只存在于函数中
let sum = 0
for(let i = 0;i<arguments.length;i++){
sum += arguments[i]
}
console.log(sum)
}
fun(1,2,3)
fun(1,2)
- 当确定用户至少输入几个参数时可使用剩余参数
function fun(a,b...arry){
//arry是一个真数组
}
开发中提倡使用剩余参数
展开运算符
const str = [