作用域与解析机制 内存管理与垃圾收集机制

154 阅读3分钟

作用域

作用域指的是 变量能够起作用的区域

全局作用域--全局变量(所有代码执行完销毁)、函数作用域(局部作用域)--局部变量,函数执行时才存活、块级作用域{}es6中才有,动态作用域

全局作用域 :在函数外部定义的变量 跨文件可以使用

没有用var 定义 也是具有全局作用域的 (不被鼓励),严格意义上来说它不算全局变量,只是作为全局对象window的属性,不但可以用window.去访问 也可以直接访问 所以看上去像全局变量

区别 属性可以被删除 变量不可以被delete

在函数中没有用var 声明的变量 具有全局作用域 作为window对象的属性

Es6定义的变量要使用不使用会报错

函数作用域:在函数中声明的变量只能在函数中使用

若希望函数中的变量可以被外部共享 可以使用return 或者闭包实现

//作用域链
var name = 'xm'
function fn(){
  var sex ='male'
  var name ='xh'
    function fn2(){
    var age =18;
    var name ='xhei'
    }
}

先找当前作用域的变量,然后再往外查找,内层变量速度访问快,jQuery中就是把window传到局部作用域使用

document.write(window.person || (window.person ='xm'))   xm

document.write(person1 || (person1 ='xm'))  报错

1,不存在的变量或函数会报错;不存在的属性或方法,返回undefined;
2,||是短路操作,形如a||b,如果a的值转换成布尔值是true的话,a||b等于a;如果a的值转换成布尔值是false的话,a||b等于b

解析机制

 1.预解析 变量会被解析为 undefined 函数会被解析为声明内容  变量与函数冲突 函数留 函数与函数冲突留后者 在代码块中的函数不会被与解析

 2.逐行读代码

3.不通过var 声明的变量是属于window上的属性,具有全局作用域,不会被预解析

4.预解析是分script解析执行的

5.函数的参数是相当于声明局部变量

垃圾收集机制:释放无用的数据 回收数据

自动:Js

手动:Objective-C

原理:找出没用的数据,打上标记,释放其内存;周期性执行

标识无用数据的策略

标记清除 :去掉还在环境中的变量,剩下还被标记的变量就是无用变量

引用计数:数据被引用的次数 弊端 循环引用影响计数

A:为了获得更好的性能,我们需要及时解除无用数据的引用;
B:离开作用域的值不会立刻被回收,只是会被打上标记,在垃圾收集期间才会回收;
C:在老版本的IE中访问非原生JS对象(DOM和BOM元素)时,引用计数这种算法可能导致循环引用的问题;

内存管理 

分配给浏览器的内存少于桌面应用程序

将数据设置为null 适用于全局变量,局部变量会在离开作用域的时候被垃圾回收机制回收