【js】 js 闭包
闭包是什么?闭包是Closure,这是静态语言所不具有的一个新特性。但是闭包也不是什么复杂到不可理解的东西,简而言之,闭包就是:
- 闭包就是函数的局部变量集合,只是这些局部变量在函数返回后会继续存在。
- 闭包就是就是函数的“堆栈”在函数返回后并不释放,我们也可以理解为这些函数堆栈并不在栈上分配而是在堆上分配
- 当在一个函数内定义另外一个函数就会产生闭包
一.变量的作用域
var s = '34';
console.info('1----------------'); function test1(){ var i = 3; m = 10; console.info(s+m*i);//3430 } // console.info(m);// m 或者i 提示 未定义 console.info('2------------'); test1(); /* * 执行函数后m变为全局变量 * */ console.info('3-------------'); // console.info(i);// i 未定义 console.info('m的值为:'+m); // 10

上边是普通的函数,定义变量时没有特殊需要都加上var,否则就声明为全局变量。区分变量的作用域为局部变量或者全局变量。
二、获取函数内部的局部变量
function test2(){ var n = 10; function t(){ // console.info('局部变量n='+n); return n ; } return t(); } var s = test2(); console.info(s);
三、javascript 闭包的用途(js闭包的用途)
闭包可以用在许多地方。它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。
/** * js 闭包的用途 */ function test3(){ var b = 99 ; tt= function(){ b++; console.info('b变量的值:'+b); } function ft(){ return b; } return ft(); } var r = test3(); console.info(r);//99 tt(); r= test3(); console.info(r);//99 不应该是100的吗??
最后的r难道不应该是100??结果全是99.不解呀.....
四、使用闭包的注意点
1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。
另外看到两个比较有代表性的例子:
var name = "The Window"; var object = { name : "My Object", getNameFunc : function(){ return function(){ return this.name; }; } }; alert(object.getNameFunc()());// The Window var name = "The Window"; var object = { name : "My Object", getNameFunc : function(){ var that = this; return function(){ return that.name; }; } }; alert(object.getNameFunc()());// My Object
参考资料:
学习Javascript闭包(Closure)
闭包
理解Javascript的闭包

浙公网安备 33010602011771号