第四章 作用域和内存问题

变量的作用域?

变量
作用:起作用
域:区域,范围
变量起作用的地方

  1. 变量的生命周期,变量生于这个作用域,死于这个作用域
  2. 访问到变量

作用域的分类

  1. 全局作用域
  2. 局部作用域:函数作用域(函数作用域)
    没有块级作用域
var name='xm';  //全局变量  全局作用域
function fn(argument){
  var sex='male';   //局部变量 局部作用域
}
console.log(sex);

全局作用域的变量相当于window的一个属性。

var name='xm';  //全局变量  全局作用域
function fn(argument){
  var sex='male';   //局部变量 局部作用域
}
console.log(window.name===name); //true
console.log(window.sex===sex); //抛出引用错误

作用域链

var name='xm';
fucntion fn(){
  var name='xh';
  var sex='male';
function fn2(){
  var name='xhei';
  var age=18;
  }
}
第四章 作用域和内存问题_第1张图片
image.png

延长作用域链

var person={};
person.name='xm';
person.sex='male';
var score=4;
console.log(person.name);  //xm
console.log(person.sex);  //male
console.log(score); //4
//延长作用域链
with(person){
  name='xh';
  sex='female';
  scroe=44;
}
console.log(person.name);  //xh
console.log(person.sex);  //female
console.log(score); //44

第四章 作用域和内存问题_第2张图片

缺点:影响查询速度
优点:少写person.
总结:很鸡肋,不推荐使用


两道题

第四章 作用域和内存问题_第3张图片
第四章 作用域和内存问题_第4张图片

说明:不存在的变量或函数会报错;不存在的属性或方法,返回undefined。
||是短路操作,形如a||b,如果a的值转换成布尔值是true的话,a||b等于a;如果a的值转换成布尔值是false的话,a||b等于b。
所以document.write(person || (person = 'xm'))是会报错,提示person is not defined;
document.write(window.person || (window.person = 'xm'));这条语句||后面的条件是true,所以返回xm。


第四章 作用域和内存问题_第5张图片
第四章 作用域和内存问题_第6张图片

说明·:,因为for循环的时候并没有执行里面的 function,所以它只绑定了点击事件后就会继续循环,直到循环结束,储存的是结束时的值;当我们点击按钮时,for 以执行完,所以每次弹出的都是最后的i值 3。
循环时只绑定了点击事件直到循环结束,当我们点击按钮时才会执行函数中的语句,点击事件实在循环结束后才会执行。


垃圾收集机制

释放无用的数据,回收内存

  • 自动:js
  • 手动:Objective-V
    原理:找到没用的数据,打上标记,释放内存,周期性执行
    标识无用数据的策略
  • 标记清除
    目前主流的垃圾收集算法
    就是不用的值加标记,然后回收其内存
  • 引用计数
    引用计数算法可能是因为循环引用的问题得不到释放
    当变量不用的时候,可以手动解除他的引用
var xm{
  name:'xm';
  age=18;
};  //xm引用这些值,所以引用1
  var xh='xm'; // xh复制xm的地址,也引用了这些值,引用2
  xh={} //原始数据值只剩下xm去引用,引用1
  xm=() //原始数据值都没有变量引用,引用0 可以回收

}

循环引用

function fn(argument){
    var xm={};//1
    var xh={}; //1
fn();
xm=null; //0
xh=null;  //0
}
function fn(argument){
  var xm={}; //1
  var xh={}; //1
  xm.wifi=xh;//2
  xh.husband=xm; //2
}
fn();
xm=null; //1
xh=null; //1
xm,xh永远不会回收 

早期浏览器IE6,7,8 DOM,BOM存在循环引用

var obj={};  //引用0
var elem=document.getElementById("box");//DOM 引用0
elem.someAttr=obj;  //引用1
obj.someProperty=elem; //引用1

elem.somAttr=null; //手动减少引用,引用0
obj.someProperty=null;// 引用0

内存管理

  • Web浏览器的内存 < 桌面应用程序内存
  • 释放内存的方式 :变量赋值为null ,解除引用,适合大多全局变量。局部变量离开作用域自动解除引用。
var arr=[...]; //数组大 耗资源
...
...
arr=null;
...

你可能感兴趣的:(第四章 作用域和内存问题)