闭包与作用域原理简解
闭包看似高大上其实只是js作用域的副产物,但是依靠他我们可以实现接近java,c++语言的私有变量.
示例代码如下
function myfunction(){
var liein=0;
this.lieout=function(){
liein++;
console.log(liein);
}
}
myclass=new myfunction();
myclass.lieout();
结果如下
作用域,顾名思义,它所能够作用,即增删改查到的地方
在运行时,电脑会自动定义词法环境,这其中有函数环境以及全局环境,用以跟踪作用域
全局环境不必多说,就是全局变量等东西所在的环境
而函数环境以示例来说myfunction环境中就由liein以及一个创建对象变量行为组成
每一个函数运行时都会有如下检索变量的顺序:自身的函数环境 --> 外层的函数环境 --> 全局环境
而这样的运行原理就构成了作用域这个大的框架
说完了作用域我们来说说他是如何实现闭包的
我们首先设置了一个myfunction里面存放了liein变量以及对一个新类创建lieout函数变量
这个函数变量实现了每次运行都对liein加一的功能,并且在控制器输出liein的值
最后我们用myclass对象储存这个函数创建的东西
并且运行该对象的lieout函数
这其中最关键的就是this.lieout=function(){...}这一语句,他将他的外层环境给了对象的lieout 从而形成了一个myclass --> lieout() --> liein这样一条作用域链,使其得以保留 这里也需要强调在这条作用域链依然存在,即还有变量可以连接liein时,他会与全局变量一样占用内存 所以对于闭包我们需要谨防过度使用
end