js的变量和闭包的理解

最近项目里涉及到关于js方面的知识,花了点时间研究下,遂记录下来:
先来点开胃小知识:
1>全局变量和局部变量
全局变量:非局部变量就是全局变量,且在引入的多个js文件中通用。
局部变量:定义在方法内部的变量,函数的形参也属于。

在方法内部定义变量,一定要加var,否则会被定义为全局变量,例子如下:

var B = A(2);
B(10);
function A(x) {
     temp = 3;
     return function (y) {
         alert(x+y+(++temp));
     }

 }
 alert(temp);   //这里会输出4,因为temp是全局变量。

//注意:如果将代码里的头两行去掉,那么alert会报错,显示undefined,不是说temp是全局变量吗,怎么未定义?
//这是因为 函数内部定义的变量,要在函数执行后才会真正定义
//这段代码内部执行情况是:执行A,发现一个没有用 var 定义的 temp 于是去全局变量中寻找是否有这个变量,结果没有,那么我就创建一个temp全局变量。 

2> js中什么可以作为if的条件?
1.布尔变量 true/false;
2.数字非0 (负数也是可以的) 为true
数字是0或者NaN 为false
3.字符串为非空串 为true

重点来了

3>关于闭包的研究和理解。

 $(function () {
            function a() {
                var i = 999;      
            return  function () {              
                      return i++;                                                
                }
            }
            var c = a(); //c指向了匿名函数function(){return i++} ,因此内部函数被a外一个变量应用。使得a一直存在。
            var x = c(); //x指向i。
            alert(x);          
            x = c();
            alert(x);
            /*
闭包的本质,就是可以读取其他函数内部变量的函数。
闭包的第一种形式:
当一个函数返回的是他内部的函数的时候  那么就是一个闭包。

当函数a的内部函数b 被函数a外的一个变量c引用的时候,就创建了一个闭包c
闭包的作用:使得a执行完毕后,GC不会回收a所占用的资源。
闭包的应用场景:1.在内存中维持一个变量,由于闭包c的存在,a中变量i可以一直维持。每次执行完c i会自动加1;
             2.通过保护变量安全时限js私有属性和私有方法。   */

上述代码中c就是一个闭包,或者说 return (){return i++} 就是一个闭包,正是由于这个闭包的存在,使得a在执行完之后,并不会被GC回收,而是保存在内存中,如它的变量 i 一值存在,所以运行一次c() i 就加 1 。

闭包的第二种形式。

闭包:函数可以调用函数之外的变量。
var a="a"
var n;
var bFn=function(){
    alert("a");
    alert("b");
    n=function(){
        var c="c";
        alert(c);
    }
}
n();  //n函数属于全局域,但可以调用bFn中的b,因为n指向它的内部函数。

其他关于很复杂的闭包例子什么的,还等着继续理解。

这是参考的一个博客:
http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html

猜你喜欢

转载自blog.csdn.net/mooneal/article/details/68483966