Javascript之最难

0.前提了解

imply global : 不声明直接赋值,此变量为全局所有

function a(){
    s = 9;     //这里的s是全局变量的声明赋值
}
console.log(s);  //输出9

1.明确“函数定义”与“函数运行”

var x = 1;
function a(){
    x = 9;
}
console.log(x);  //输出1

GO {x : 1}
a 定义  [[scope]]  --->   0 : GO {x : 1}   

//第二步
var x = 1;
function a(){
    x = 9;
    var s = 0;
}
a()
console.log(x);  //输出1

a 定义  [[scope]]  --->   0 : GO {x : 1}

a 执行  [[scope]]  --->   0 : AO {s : 0}  
                   --->   1 : GO {x : 1}
//a执行,生成自己的作用域,如果要使用x则从[[scope]]里从上往下找

2.分析闭包特点

廖雪峰JS教程闭包中的例子:

function count() {
    var arr = [];
    for (var i=1; i<=3; i++) {
        arr.push(function () {
            return i * i;
        });
    }
    return arr;
}

var results = count();
var f1 = results[0];
var f2 = results[1];
var f3 = results[2];

f1(); // 16
f2(); // 16
f3(); // 16

为什么不是打印1,4,9而是16,16,16 ???

分析:

count 定义        [[scope]]   --->   0 : GO

count 执行        [[scope]]   --->   0 : AO(count) {arr : [3 x function()], i : 4}       
                  [[scope]]   --->   1 : GO

//count执行 匿名函数才会被定义
匿名函数定义       [[scope]]   --->   0 : AO(count)  {arr : [3 x function()], i : 4}
                                     1 : GO

匿名函数执行       [[scope]]   --->   0 : AO(匿名函数)
                                     1 : AO(count)  {arr : [3 x function()], i : 4}
                                     2 : GO

 保持头脑清醒再想一想函数定义和函数执行的区别!

arr.push(function () {
            return i * i;
        });

   这个arr里不过是放了三个函数的定义,直到他们执行时才会从作用域链里找变量值,

   [[scope]] 0里并没有i值,往下找,1里面i为4,找到执行返回值,搞定。    

 

 

你可能感兴趣的:(Javascript之最难)