JS笔记继续

3.只有表达式才能被执行符号执行,能被执行符号执行的表达式,这个函数的名字就会被自动忽略。被执行符号执行的表达式就变成了立即执行函数。
  例1:
    var test = function (){   //函数表达式。test是变量名,这个函数执行完后。就被永久的放弃了,就没了。再执行test结果就是undefined,test()就是报错。
       console.log('a');
    }()                      // 执行符号就是(),()之前的只有是表达式才能被执行符号执行,这个例子是函数表达式,所以能被执行符号执行。还有()后面加不加;都行。
  例2:
    + function test() {     // 加上+号或者-号或者!或者与或非能行 不过前面得加东西符合与或非使用规则,加上以上就是表达式,所以能被执行符号执行。
        console.log('a');
    }();
  例3:    (function test(){})  //函数声明被包起来了,是表达式。
  例4:(w3c建议使用的方式)
    (function test(){   //因为test是执行完然后就被释放了,再执行就会报错,所以函数名就可以不写了(立即执行函数的演变过程)
        console.log('a');
    }())               //这些括号先识别外边的,只有最外层的是数学运算小括号,剩下的所有括号都是有语法意义的。所以最外面的括号会将里面的东西变成表达式,表达式正好被执行符号执行。这个函数执行位置不在它定义位置。17:44 2018/6/24
  例5:
    function test(a,b,c,d){
        console.log(a + b + c + d);
    }(1,2,3,4);        //系统不报错也不执行,它会将前面的函数声明与后面的 (1,2,3,4)当作两个语句分开,再执行。


48.利用闭包问题解决闭包(必须记住这个,怎么触发,怎么解决等)
 1.
    function test(){                          //test函数中一共有两个变量,arr与i
        var arr = [];
        for(var i = 0; i < 10; i ++){          //不管中间怎么执行的,最后i的值就为10(i = 10才能结束循环,执行完函数)
            arr[i] = function(){              //只是将函数赋给arr[i],函数中内容什么的不管,只有执行时才会考虑,所以函数中的i并不是1,2,3,4等等,不随着arr[i]变化,函数定义时不用看里面的东西,没有意义,当函数执行时再找里面的东西。
                document.write(i  + "  ");    //系统只是将一个引用抛进去了,其中内容是什么不知道,只有当执行时才会考虑i到底是什么,系统执行时就是将一个函数抛进去了,但是函数内容是什么并不知道
            }
        }
        return arr;                           // arr中存放的是十个不同的相互独立的,但是长得一样的函数。
    }
    var myArr = test();                      //这时才会真正执行那个arr[i](一共10个函数)
    for(var j = 0;j < 10;j ++){
        myArr[j]();                          //才会真正访问test作用域,并且因为所有函数都是访问一个作用域,所以访问的都是一个i值所以输出结果为10个10
    }
 2.(对1的更改,只有这一种解法!!!)
    function test (){
        var arr = [];
        for(var i = 0 ; i < 10; i ++){
            (function (j){                   //立即执行函数立即被执行,里面的语句一条一条被执行
                arr[j] = function (){        //这只是赋值语句,但并不代表这个函数就要执行,就像1中一样。
                    document.write( j + " ");
                }
            }(i))
        }
        return arr;
    }
    var myArr = test();
    for( var j = 0; j < 10; j ++){
        myArr[j]();
    }
 3.
    for(var a = 0; a < 10; a ++){
                
    }
    console.log(a);                         //可以打印出a = 10;

猜你喜欢

转载自blog.csdn.net/LFY836126/article/details/80793240
今日推荐