首页 > 代码库 > js变量作用域和闭包的示例

js变量作用域和闭包的示例

<script>
        /*
      js是函数级作用域,在函数内部的变量,内部都能访问, 外部不能访问内部的,但是内部可以访问外部的变量
            
      闭包就是拿到本不该属于他的东西,闭包会造成内存泄漏,你不知道什么时候会用这个闭包,然后这个资源会一直占据内存,造成内存泄漏
     */

        /*1 --函数内部可以访问外部的变量*/
        /*var i = 10;

        function test() {
            console.log(i);
        }
        test();*/

        /*2  在函数外部,我们就不能访问函数内部的变量,不然会报变量没有被定义*/
        /*function test() {
            var j = 20;
        }
        console.log(j);*/    //test.html:19 Uncaught ReferenceError: j is not defined

        /*3  函数的嵌套--这个a函数就能访问test函数的j变量*/
        /*function test() {
            var j = 5;

            function a() {
                console.log(j);
            }
            a();
        }
        test();*/    //5

        /*4*/
     /* function test() {
            
            if(false) {
                var i = 5;
            } else {
                j = 10;
            }
            //i--undefined 是没有被赋值而已    j--10
            //test.html:42 Uncaught ReferenceError: k is not defined 这就是没有定义--报错

            console.log(i+"-->"+j +"-->"+k);
        }
        test();*/

        /*5  -- 这里 在执行的过程中,会将test()这个函数前置,但是在调用它的时候却不会找到j,因为j是在后面定义的*/    
        /*test();    //undefined
        var j = 10
        function test() {
            console.log(j);
        }*/

        /*6*/
        /*test();    //返回 undefined
        var k = 200;
        function test() {
            console.log(k);
        }*/

        /*7*/
        /*
        var k;
        test();        //undefined
        k = 200;
        function test() {
            console.log(k);
        }
        */

        /*其实例子6和7是一个意思,都是变量定义了,但是没被赋值,执行test()的时候,都返回undefined*/

        /*9面试题:函数前面加一个波浪线*/
        /*var j = 100;
        ~(function() {
            console.log(j);
        })();    //返回100
        */

        /*10 函数前面没有波浪线的情况*/
        /*var k = 5;
        (function() {
            console.log(j);
        })();*/
        //返回  --》test.html:89 Uncaught ReferenceError: j is not defined

        //函数前面加波浪线,此时会将函数转化为一个表达式 输出  所以这个波浪线很重要

        /*11面试题:*/
        /*var i = 10;
        function test() {
            console.log(i);
            var i;
        }
        test();    */
        // 返回undefined   这里的后面的var i;这条语句会被前置,然后会将外面的全局变量i给覆盖掉,此时这里面的i又没有被赋值,所以,执行test()会返回undefined;  下面12的例子说明这个问题

        /*12*/
        /*var j = 20;
        function test() {
            var j;
            console.log(j);
            j = 5;
            
        }
        test();    *///返回undefined  和11是一样的,这里在函数内部定义了j 直接把外部的j给覆盖掉了,然后赋值操作又在console语句的后面,所以会出现undefined

        /*---------------------------分割线----------------------*/
/*13 --这里就是闭包 将我们函数里面的内容用函数的方式返回出去*/ /*function test() { var j = 5; return function() { return j; } } var t = test()(); console.log(t);*/ </script>

 深入理解Js的执行过程很重要

这里有,js如何解析函数的

js变量作用域和闭包的示例