zoukankan      html  css  js  c++  java
  • 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如何解析函数的

  • 相关阅读:
    Representation Data in OpenCascade BRep
    Render OpenCascade Geometry Surfaces in OpenSceneGraph
    Render OpenCascade Geometry Curves in OpenSceneGraph
    OpenCascade Shape Representation in OpenSceneGraph
    Geometry Surface of OpenCascade BRep
    Geometry Curve of OpenCascade BRep
    Tyvj2017清北冬令营入学测试
    Spfa算法模板
    洛谷1016 旅行家的预算
    洛谷1290 欧几里得的游戏
  • 原文地址:https://www.cnblogs.com/xiaqilin/p/6915976.html
Copyright © 2011-2022 走看看