• js...............................作用域


    一:作用域和闭包

    /*
    受bar函数声明的位置所影响,foo()的局部作用域在执行完后没有被回收(内存的释放);
    原因是bar函数本身还在使用,bar()依然持有对该作用域的引用,而这个引用就叫作闭包。即bar()对foo()该作用域的引用.
     */
    
    //代码一:
    /*
    function foo() {
    var a = 2;
    function bar() {                    //此时bar还没有进行定义,在外部调用的时候他是不存在的.
    console.log('foo函数的局部变量:',a);
    }
    return bar;  //返回该函数的地址
    }
    var s = foo();
    console.log(s);
    console.log('执行函数bar');
    console.log('	');
    s();
     */
    //代码2:
    /*
    var fn; //全局变量
    function test() {
    var a = 2;
    function bar() {
    console.log('执行函数bar()')
    }
    baz(bar);
    return bar;
    }
    function baz(s) {
        console.log('在函数baz中调用bar()函数');
        s();
    }
    fn = test();
     */
    //setTimeout()为window对象的内置方法,对于window对象来说在使用其方法时可以不使用点运算符.
    function wait(message) {
    setTimeout(function timer() {  //setTimeout():设置在指定的毫秒数后执行的函数或计算表达式。
    console.log(message);
    },10000)
    }
    wait('hello,cloure!');
    function setupBot(name,selector) {
    $(selector).click(function activator() {
    console.log('Activating:'+name);
    });
    }
    setupBot('Closure Bot 1','#bot 1');
    setupBot('Closure Bot 2','bot 2');

     二:通过:匿名函数的定义,和返回函数的函数.来理解作用域。

      1:注意函数名:

    <!DOCTYPE html>
    <html>
    <head>
        <title>函数</title>
    </head>
    <script type="text/javascript">
        var c = function() /*用c来引用匿名函数*/
        {
            document.write("执行匿名函数");
            var s = test(); /*s是局部作用域*/
            s(100,50);/*执行的是函数test_son*/
            console.log(typeof(test_son)); //undefined,为什么是undefined,因为他已经被s引用了。
            console.log(typeof(s));//function
            return 0;
        }
        function test()/*返回函数的函数*/
        {
            var b = 23; /*局部作用域test中的变量*/
            function test_son(x,y)/*注意不要这样使用functiontest_son(var x,var y)在函数的参数中这样定义变量说明x,y是这个块的作用域中的变量.*/
            {
                console.log("形参x,y="+x+","+y);
                console.log("b");
            }
            return test_son;/*返回的是函数的地址*/
        }
        c();
    </script>
    <body>
    
    </body>
    </html>

         2:方法被封装到了立即执行匿名函数中,如果不添加返回值,外部是访问不到的,添加返回值后,在全局可以通过“匿名函数.函数名()”的方式进行调用。并且可以隐藏一些私有属性和元素,私有空间的函数和变量也不会影响全局作用域,可见这种方式是最理想的方式。大部分第三方库都使用这种形式,例如jQuery。

    <!DOCTYPE html>
    <html>
    <head>
        <title>作用域</title>
    </head>
    <script type="text/javascript">
        var bigfun = (function()/**/
        {
            var big = 12;
            function add(x,y)
            {
                var a = 12;/*改变量的作用域:*/
                console.log("bigfun函数中的变量"+big);
                return x+y;/*有返回值的*/
            }
            function sum()
            {
                document.write("sum是没有返回值的函数");
                return 0;
            }
            function divide(a)
            {
                document.write(a);
                document.write("执行divide函数,来输出var big"+big);
                return 0;
            }
            return{ /*返回*/
                add:add, //左边的为bigfun对象的属性,右边为函数地址。这里是用属性引用函数的方式。
                sum:sum,
                divide:divide
            }
        })();
    var x = bigfun.add(100,100);//输出:bigfun函数中的变量12
    console.log(x);//输出:200
    console.log(typeof(bigfun));//输出:object
    //bigfun是什么数据类型.?
    
    //数组的定义?
    </script>
    <body>
    
    </body>
    </html>
  • 相关阅读:
    SharedPreferences
    Handler
    Gallery 和ImageSwitcher
    poj 1077 Eight (BFS)
    HDU 1208 Pascal's Travels( 记忆化搜索)
    HDU 1619 Unidirectional TSP (dp,dfs)
    HDU 3683 Gomoku (枚举+BFS)
    HDU 3647 Tetris (暴力DFS)
    poj 1020 Anniversary Cake (DFS)
    poj 1375 Intervals(解析几何 过圆外一点求与圆的切线)
  • 原文地址:https://www.cnblogs.com/1314bjwg/p/12389695.html
Copyright © 2020-2023  润新知