JavaScript进阶
一、作用域&解构&箭头函数
1.作用域
作用域:规定了变量能够被访问的“范围”,离开这个“范围”将不能被访问到。可分为局部作用域和全局作用域。
1.1.局部作用域
局部作用域分为:函数作用域和块级作用域
函数作用域:函数作用域:1.只能在函数内部调用,函数外部无法访问 2.函数的参数也算函数的局部变量 3.不同函数内部声明的变量无法相互访问 4.函数执行完毕后函数内部的局部变量将会被清空。
function sum(num) {
let a = 100;
console.log(a,num); //100,10
}
sum(10)
console.log(a); // error:a is not defined
块作用域:在JavaScript中用{}包裹的叫代码块,代码块内部声明的变量将有可能被外部访问,不同代码块间的变量无法相互访问。
// 用let 和const 声明的变量会产生块级作用域,无法被外界访问
for (let i = 0; i < 3; i++) {
console.log(i); // 0,1,2
}
console.log(i); //error: i is not defined
// 用var声明的变量不会产生块级作用域,可以被外界访问到
for (var j = 0; j < 3; j++) {
console.log(j); //0,1,2
}
console.log(j); //3
1.2.全局作用域
const a = 1; //方1.在<script>或.js文件最外层声明的变量即为全局变量(推荐使用)
function fn() {
window.b = 2; //2.window对象动态添加属性(不推荐)
c = 3; // 3.未用任何关键字声明的变量视为全局变量
var d = 4;
}
fn()
console.log(a); //1
console.log(b);//2
console.log(c); //3
// 尽量减少全局变量,防止全局变量被污染
1-3.作用域链
作用域链本质上是底层变量的寻找机制。在函数执行时,会优先查找当前作用域变量,如果找不到则依次逐级查找父级作用域知道全局作用域。一层一层的作用域串联形成了作用域链。子作用域能访问父级作用域变量,父级作用域无法访问子作用域变量。
let a = 1;
let b = 2;
function f() {
let a= 1;
console.log(a);
function g() {
a = 3;
console.log(3);
}
g()
}
f()
1.4.垃圾回收机制
内存的生命周期
js中分配的内存中有以下声生命周期:
内存分配:当声明变量、函数或对象时,系统将为他们分配内存空间
内存使用: 内存读取,即使用变量、函数、对象
内存回收:使用完毕,由垃圾回收器自动回收不再使用的内存
说明: 1.全局变量一般不会被回收(页面关闭时回收) 2.局部变量的值,不再使用了将会被自动回收
内存泄漏: 当分配的内存由于某种原因未释放或无法释放时将产生内存泄漏
垃圾回收机制算法
**引用计数法:**跟着记录被引用的次数,被引用则加1,减少引用减1.当引用次数为0,则释放内存。弊端:嵌套引用,循环引用时不会被回收,导致内存泄漏(多数浏览器不在使用)
function fn() {
let obj1 = {}
let obj2 = {}
obj1.a = obj2;
obj2.a = obj1
}
fn()
标记清除法: 从根部(即js全局对象)出发定时扫描内存中的对象,凡是从根部到达的对象,都是需要使用的,那些无法从根部到达的对象将标记为不再使用,稍后将进行回收。