首页 > 代码库 > Javascript 闭包与作用域

Javascript 闭包与作用域

        今天来说下javascript的作用域及闭包使用。先说下作用域的概念,各种开发语音都会遇到变量的生命周期,使用范围,使用范围其实就是变量的作用域,字面意思理解就是这个变量在那段代码区间内有效。

1、.Javascript的作用域是函数作用域而非块级作用域,看代码:

    (function(){
        var i=1;
        if(i==1){
            var j=3;
        }
        console.log(j);     //在这里可以访问
    })()

在这里,j是可以访问的,也就是说在一个函数中的任何位置定义的变量在该函数中的任何地方都是可见的,再看另一种情况:

function a(){
    function b(){
        //code
    }
}
b方法同样可以使用a方法中声明的变量,原理同上。

2.Javascript中变量的作用域分为全局变量和局部变量,看代码:

var p=11;
function f1(){
   console.log(p);
}
f1();   //11
在方法体外部声明的变量为全局变量,该变量在任何方法中都可访问。再看下另外一种全局变量声明方式:

function f1(){
    p=11;
}
f1();
console.log(p);  
由于p=11在方法体中声明,相当于已经有了p这个全局变量,所以这种声明方式也可以,但不推荐使用。

3.那如何访问函数内部的变量并对它进行操作呢?这里就需要用到闭包

先看看闭包的官方解释:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分

看到这句户我不禁想问,这是个啥?

后来参考了一些博客和《Javascript秘密花园》才开始理解,闭包大概就是函数内部的一个函数被外部调用,这样就可以调用内部变量了,比如下面这段

function f1(){
    var p=11;
        return {
            increment: function() {
                p++;
            },
     
            show: function() {
                alert(p)
            }
        }
}
var f=f1();
f.show();      //11
f.increment();
f.show();      //12
这种方式类似于java bean中对于private 变量的get set方法。

Javascript 闭包与作用域