代码开发的格式 - 注意冲突和依赖
作用域:
任何程序设计语言都有作用域的概念,简单的说,作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。
局部作用域和全局作用域
在JavaScript中,变量的作用域有全局作用域和局部作用域两种
全局作用域(变量):整个程序都有效,即整个代码中都可以调用(变量前面没有添加var变成全局的属性)
局部作用域(变量):只对函数内部有效,即只能在本变量声明的函数内部调用。
var a =1;//全局
function fn(){//函数是半透明的,里面看到外面,外面看不到里面。
var b=2;//局部
c=3;//没有var,变成全局的属性
alert(a);//1
}
fn();
alert(a);//1
alert(c);//3
alert(b);//报错 b is not define
作用域链
通俗地讲,当声明一个函数时,局部作用域一级一级向上包起来,就是作用域链。
当执行函数时,总是先从函数内部找寻局部变量如果内部找不到(函数的局部作用域没有),则会向创建函
数的作用域(声明函数的作用域)寻找,依次向上查找。
在函数体内,局部变量的优先级高于同名的全局变量-作用域链
var num =1;
function a(){
var num =2;
function b(){
var num =3;
function c(){
var num =4;
alert(num);
}
c()
}
b()
}
a();
作用域控制着变量与函数的可见性和生命周期。
全局变量:生存周期对于全局变量是永久的,除非我们主动销毁这个全局变量。(浏览器垃圾回收机制)
局部变量:函数内用 var 关键字声明的局部变量,当退出函数时,它们都会随着函数调用的结束而被销毁。
垃圾回收方式–浏览器
标记清除(mark and sweep)、引用计数(reference counting)。
1 标记清除
大部分浏览器以此方式进行垃圾回收,当变量进入执行环境(函数中声明变量)的时候,垃圾回收器将其标记为“进入环境”,当变量离开环境的时候(函数执行结束)将其标记为“离开环境”,在离开环境之后还有的变量则是需要被删除的变量。
垃圾收集器给内存中的所有变量都加上标记, 然后除了环境中的变量以及被环境中的变量引用的变量。在此之后再被加上的标记的变量即为需要回收的变量, 因为环境中的变量已经无法访问到这些变量。
function fn(){
var a =1;
return function(){
return a++;
}
}
2 引用计数
低版本的IE使用这种方式。 机制就是跟踪一个值的引用次数, 当声明一个变量并将一个引用类型赋值给该变量时该值引用次数加1, 当这个变量指向其他一个值,该值的引用次数便减一。 当该值引用次数为0时就会被回收。
该值引用次数为0时,还不能被回收,一直占据内存,叫做内存泄漏。
闭包
概念:定义在一个函数内部的函数(函数嵌套函数),闭包就是将函数内部和函数外部连接起来的一座桥梁。
闭包的特点:
在一个函数内部定义另外一个函数,并且返回内部函数。(外部获取函数内部的变量)
内部函数可以读取外部函数定义的局部变量(利用函数内部的函数间接将函数内部的变量返回)
让局部变量始终保存在内存中(保持内部的函数一直访问)。也就是说,闭包可以使得它诞生环境一直存在。
注意冲突和依赖
全局变量一直存在,少用,函数内部的变量用完即销毁,可以用。
function fn(){
var a = 100;//局部
function fnA(){
alert(a);
}
fnA()
}
fn();
形成独立的作用域(开发的环境)
闭包的写法 - 开发的常见写法(不是最优)
(function(){
var a = 100;//局部
function fnA(){
alert(a);
}
fnA();
})();
!function(){
var a = 100;//局部
function fnA(){
alert(a);
}
fnA();
}();
总结:
1.面试(概念,优缺点,应用场景)
2.开发中的一种格式 - 闭包写法
3.避免全局污染。
什么是闭包(闭包的原理)
闭包的形成与变量的作用域以及变量的生存周期密切相关,变量的作用域,就是指变量的有效范围。
生存周期对于全局变量是永久的,除非我们主动销毁这个全局变量。(垃圾回收机制)
而对于在函数内用 var 关键字声明的局部变量来说,当退出函数时,它们都会随着函数调用的结束而被销毁:
总结:全局变量一直存在,少用,函数内部的变量用完即销毁,可以用。
闭包就是能够读取其他函数内部变量的函数**。由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数"。所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。
闭包的特点
在一个函数内部定义另外一个函数,并且返回内部函数。**
内部函数可以读取外部函数定义的局部变量(利用函数内部的函数间接将函数内部的变量返回)
让局部变量始终保存在内存中。也就是说,闭包可以使得它诞生环境一直存在。
闭包的优缺点–面试题
闭包的好处:
希望一个变量长期存储在内存中(延长作用域)。
避免全局变量的污染。
私有成员(函数内部的变量)的存在。
闭包的缺点:
变量常驻内存,增加内存使用量–手动销毁,设为null
使用不当会很容易造成内存泄漏–IE
闭包的应用场景
1、永久存储函数内部的变量,有弊端(增加内存使用量)
2、避免全局变量的污染–利用闭包的写法进行开发
3、自执行的匿名函数保存循环变量