JS作用域函数闭包

js作用域


<html>
    <head>
        <meta charset="UTF-8">
        <title>title>
    head>

    <body>
        <script>
            //【变量提升】
            console.log("h="+h);//并未报错出现,undefined;
            var h = 20;
            /*上面写法其实就是下面这种:
             * var h ;//将后面所出现的变量提升,但赋值并未提升,故h是为定义
             * console.log(h);
             * h = 20;
             */
            var a = 10; //全局
            for(var i = 0 ; i < 2; i++){
                var b = 10;
            }
            for(var i = 0; i < 3; i++) {
                var a = i; //此处a和外部a同处一个全局作用域,所以覆盖
            }
            if(a==2) {//a通过上层for变为2
                var c = 10; //全局
                e = 20; //全局
            }
            console.log("b=" + b + " 说明for(中b是全局变量)"); //b=10;
            console.log("a=" + a + " 说明for(中a是全局变量)"); //a=2;
            console.log("c=" + c + " 说明if(中c是全局变量)"); //c=10;
            console.log("e=" + e + " 说明if(中未定义的e是全局变量)");//e=20

            function text() {
                var d = 20; //局部,出作用域就被销毁释放,外部无法访问
            }
            text();
//          alert(d);//error:d is not a defined;(函数中d是局部变量)

            //总结:
            //【1】:没用var定义的变量为全局变量(严格模式不支持)
            //【2】:function函数内部定义的变量称之为局部变量,除此之外都是全局变量

//-----------------------------------------------------------------------------

            // 外内部存在同名变量,内部没有该变量的定义
            var f = 6;
            function demo(){
                console.log("f= "+f);//f=6  f来自外部全局变量
                f = 12;
                return f;
            }
            console.log("demo()函数f返回值:"+demo());//f=12


            // 外内部存在同名变量,内部有该变量的定义
            var g = 6;
            function demo2(){
                console.log("g= "+g);//g = undefine;   g在本局域函数块中找到g的变量的定义,但并未赋值故出现undefine
                var g = 14;
                return g;
            }
            console.log("demo2()函数g返回值:"+demo2());//f=14

            //总结:
            //外内部存在同名变量,需要先判断内部有没有重新新定义这个变量,
            //【1】:若重新定义,那就用新定义的 
            //【2】:否则用外部作用域的变量;
            //【作用域链】:先在本局域块中找,该变量是否定义以及赋值,若没有则往父级作用域去寻找,当到全局中还未找到,则报错;


        script>
    body>

html>

匿名函数


<html>

    <head>
        <meta charset="utf-8" />
        <title>title>
        <script>
            //函数有:匿名+具名
            //匿名函数:变量调用|自执行|事件调用
            window.onload = function() {
                for(var i = 1; i < 4; i++) {
                    var btn = document.getElementById("button" + i);
                    //函数自执行
                    (function(num) {
                        btn.onclick = function() {
                            alert("button" + num);
                        }
                    })(i);
                }
            }
            //【2】变量调用
            /*var demo = function (){
                console.log("我是变量调用的函数");
            }
            demo();*/

            //【3】给事件添加匿名函数,匿名函数可以当作参数来传递
            //匿名函数可以当作返回值,返回出去;
            /*      setInterval(function(){
                    },20);
            */

            //【4】:普通函数
            function box(){
                return "hello";
            }
        script>

    head>
    <body>
        <input type="button" id="button1" value="button1" />
        <input type="button" id="button2" value="button2" />
        <input type="button" id="button3" value="button3" />
    body>

html>

闭包


<html>
    <head>
        <meta charset="UTF-8">
        <title>title>
    head>
    <body>
        <script>
        //闭包:
        //【1】:读取函数内部的变量
        //【2】:让这些变量始终都保存在内存中
            function fun1(){
                var a = 10;
                 d = function(){//d未定义   故为全局变量,外部可访问
                    console.log("a= "+(a+1));
                }
                function fun2(){
                     a=20;
                    console.log("a= "+a);
                }
                return fun2;
            }
            var t = fun1();
            t();//a=20
            d();//a=21

        script>
    body>
html>

你可能感兴趣的:(JS,函数,闭包,javascript)