第四章 作用域和内存问题

变量的作用域?

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

  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;
  }
}
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


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


两道题


说明:不存在的变量或函数会报错;不存在的属性或方法,返回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。



说明·:,因为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;
...
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容