变量的作用域
两种:
全局变量和局部变量,JS特殊在于函数内部可以直接读取全局变量(在函数外部自然无法读取函数内的局部变量)
注意:函数内部声明变量的时候,一定要使用var命令,否则声明了一个全局变量
“链式作用域”结构:
在函数的内部再定义一个函数,子对象会一级一级地向上寻找所有父对象的变量。所以父对象的所有变量,对子对象都是可见的,反之则不成立。
闭包
(1)闭包是指有权访问另一个函数作用域的变量的函数
(2)创建闭包的常见方式,就是在一个函数内部创建另一个函数。
(3)内部的函数通过return被保存在了外部,一定生成闭包。
(4)当内部函数被保存到外部时,将会生成闭包。闭包会导致原有作用域链不释放,造成内存泄露。
闭包的作用
实现公有变量
eg:函数累加器
可以做缓存(存储结构)
eg:eater
可以实现封装,属性私有化
eg:Person();
模块化开发,防止污染全局变量
个人理解,闭包就是能够读取其他函数内部变量的函数。因为在JS中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成“定义在一个函数内部的函数”。所以在本质上,闭包就是将函数内部和函数外部链接起来的一座桥梁。
使用闭包需要注意:
(1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。
立即执行函数
两种写法
(function(){}());W3C建议第一种
(function(){})();
只有表达式才能被执行符号执行