1,词法作用域:代码在编写过程中体现出来的作用范围,代码一旦写好,不用执行,作用域范围就已经确定好了。
2,js词法作用域:
函数允许访问函数外的数据
整个代码结构中只有函数可以限定作用域
作用规则首先使用提升规则分析
如果当前作用规则中有名字了,就不用考虑外面的名字
3,闭包
闭包的含义就是闭合,抱起来。简单的来说就是一个具有封闭功能与包裹功能的一个结构。所谓的闭包就是,有一个具有封闭的对外不公开的,包裹结构,或空间。
在js中函数可以构成闭包,一般函数就是一个代码结构的封闭结构,即包裹的特性,同时根据作用域规则,只允许函数访问外部的数据,外部无法访问函数内部的数据,即封闭的对外不公开的特性。因此说函数可以构成闭包。
4,闭包要解决什么问题
闭包不允许外界访问
要解决的问题就是间接访问该数据
函数就可以构成闭包,要解决的问题就是访问到函数内部的数据
eg:
function foo( ){
var num=123;
return num;
}
var res=foo( );
console.log(res);//=>123
//这里的确是访问到函数中的数据了,但是该数据不能第二次访问,因为第二次访问的时候又要调用依稀foo,表示又有一个新的num=123出来了
//解决办法
function foo( ){
var num=Math.random( );
function func( ){
return num;
}
return func;
}
var f=foo( );
//f可以直接访问num
var res1=f( );
var res2=f( );
练习
function foo( ){
function func( ){ }
return func;
}
foo( )//->结果是func
foo( )( )//->双圆括号,表示调用了func
**************************************************************************
如何获得超过一个数据
function foo(){
var num1=MAth.random();
var num2=MAth.random();
return {
num1:function ( ){
return:num1
},
num2:function ( ){
return:num2
}
}
如何完成读取一个数据和修改这个数据
function foo( ){
var num=MAth.random();
return{
get_num:function( ){
return num;
},
set_num:function(value ){
num=value;
}
}
闭包 的基本用法
1,带有私有访问数据的对象
function Person( ){
this.name='张三';
}
//所谓的私有数据,就是说只有函数内部可以访问的数据,或对象内部的方法可以访问的数据
function Person( ){
var name=‘’;
return{
get_num:function( ){
return name;
},
set_num:function(value ){
if( value.charAt(0) )==='张'){ //->获取第一个字符
name=value;
}else{
throw new Error( ' 姓氏不对')
}
}
}
2,带有私有数据的函数
var foo =(function ( ){
//私有数据
return function() {
//可以使用私有的数据
}
})( );
3,闭包的性能问题
函数执行需要内存,如果闭包引出的数据,还有变量引用的话,数据就不会回收,因此,在使用闭包的时候如果不使用某些数据了,一定要赋值一个null