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如何解析函数的

  • 相关阅读:
    1.根据文件路径文件或文件夹图标获取 2.根据后缀获取系统图标
    多线程处理一个问题和多个问题
    C#汉字转换拼音技术详解
    委托小实例
    Winform 线程
    word 转换成 pdf
    几道算法题目
    双色球生成器
    c# Invoke和BeginInvoke
    C# 委托和事件2
  • 原文地址:https://www.cnblogs.com/xiaqilin/p/6915976.html
Copyright © 2011-2022 走看看