作用域
作用域指的是 变量能够起作用的区域
全局作用域--全局变量(所有代码执行完销毁)、函数作用域(局部作用域)--局部变量,函数执行时才存活、块级作用域{}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 适用于全局变量,局部变量会在离开作用域的时候被垃圾回收机制回收