(未完待续)闭包 上下文练习

 1 console.log(parseInt(1e1));
 2 console.log(parseInt('1e1'));
 3 console.log(parseFloat('1e1'));
 4 console.log(isFinite(0/10));
 5 console.log(isFinite(20/0));
 6 console.log(isNaN(parseInt(NaN)));
 7 
 8 
 9 var a = 1;
10         function f(){
11             var a = 2;
12             function n(){
13                 alert(a);
14             }
15             n();
16         }
17         f();
// 闭包2道练习题

// 第1道

let foo = function(){
    let i = 0;
    return function(){
        console.log(i++);
    }
}
let f1 = foo();
let f2 = foo();
f1();// 0
f2();// 0
f1();// 1

// 第2道

let x = 100;
let y = 200;
let funA = function(x){
    x += 1;
    let y = 201;
    let funB = function(){
        console.log(x); // 102
        console.log(y); // 201
    }
    return funB;
}
let f = funA(101);
f();

10
1
10
true
false
true

alert(2);

JS与很多程序设计语言不同,它不存在大括号级的作用域,但它有函数作用域,也就是说,在函数

内定义的变量在函数外是不可见的。但如果该变量是在某个代码

块中定义的(如在某个if 或者 for语句中),它在代码块是可见的-

在JS中,每个函数都有一个自己的词法作用域 也就是说,每个函数在被定义时。(而非执行时)

都会创建一个属于自己的环境(即作用域) 

当你看到 var a =2 可能认为这是一个声明 ,但JS实际上会看成两个声明 

var  = a    a= 2  

第一个声明会在编译阶段进行 第二个赋值 声明 

会被留在原地等待执行阶段 

先有蛋(声明) 后有鸡(赋值)

函数优先 变量 

当函数 可以记住并访问所在的词法作用域时,就产生了闭包,即使 函数是在当前词法作用域之外执行

在定时器 事件监听器 使用了回调函数  实际上就是在使用闭包 

(未完待续   )

猜你喜欢

转载自www.cnblogs.com/ATnTention/p/11503463.html
今日推荐