知识点>
js的作用域和闭包
闭包官方文档:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Closures
JavaScript 变量可以是局部变量或全局变量。
私有变量可以用到闭包。
什么是闭包:
> 就是函数的局部变量集合,只是这些局部变量在函数返回后会继续存在。
> 就是函数的“堆栈”在函数返回后并不释放,我们也可以理解为这些函数堆栈并不在栈上分配而是在堆上分配
> 当在一个函数内定义另外一个函数就会产生闭包
> "注:变量声明时如果不使用 var 关键字,那么它就是一个全局变量,即便它在函数内定义。"
闭包的注意点
1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。
解决方法是,在退出函数之前,将不使用的局部变量全部删除。
2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),
把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。
闭包需要注意的两种情况----函数作为返回值,函数作为参数传递。
例子:函数作为返回值
1. function greeting(name) {
2. var text = 'Hello '; // local variable
// 每次调用时,产生闭包,并返回内部函数对象给调用者
3. return function() {return text += name; }
}
4. var sayHello=greeting("Closure");
5. document.write(sayHello());
6. document.write("<br>");
7. document.write(sayHello());
8. document.write("<br>");
9. document.write(sayHello());
10. document.write("<br>");
11. document.write(sayHello());
12. document.write("<br>");
13. document.write(sayHello());// 通过闭包访问到了局部变量text
代码解析:
> 执行第4行时第一行的函数运行一次,返回内嵌函数引用作为第4行sayHello变量的值。
> 之后的第5到13行执行的函数操作其实只是执行sayHello指向的函数(即返回的内嵌函数)。
> 解释text为什么能自增,闭包的概念。
例子:函数作为参数传递
1. var num = 10;
2. var fun = function(var num){
3. console.log(num);
}
4. !function(f){
5. var num = 100;
6. f(num);
7. }(fun)
代码解析:
> 第四行'!'表示高优先级,被'!'标注的先执行。
> 第7行将fun指向的引用2行函数传给参数f在函数中执行f(?)函数,此时log出来的值是10。
> 解释看js作用域
参考: