javascript的作用域以及闭包现象

1、  词法作用域

词法作用域就是定义在词法阶段的作用域,换句话说,也就是js的作用域时在定义阶段决定的,和调用无关。

1.1 作用域沿着作用链向上查找

<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>

</body>
<script type="text/javascript">
    //引擎执行console.log();在bar()内找不到a,向上查找,foo()也找不到,继续向上查找,在window全局中查找,找到a;
    function foo(){
        var b = a*2;
        function bar(c){
            console.log(a,b,c) // 2 4 8
        }
        bar(b*2);
    }
    var a =2;
    foo(2)

</script>
</html>

  

1.2 函数作用域,定义函数时,会创建自己的气泡(作用域),外部作用无法直接访问。

1.3 立即执行函数 IIFE(Immediately Invoked Function Expression)

<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>

</body>
<script type="text/javascript">
    var a = 100;
    (function foo(){
        var a =1;
        console.log(a);
    })()
    console.log(a);  //100
</script>
</html>

1.4块级作用域

javascipt没有块级作用域,块级定义的变量会污染上一级作用域

<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>

</body>
<script type="text/javascript">
        for(vart i=1; i<10; i++){}
        console.log(i);  //10
</script>
</html>

1.5 let语法

es6引入let语法可以解决js没有块级作用域问题,强行绑定所在作用域

<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>

</body>
<script type="text/javascript">
        for(let i=1; i<10; i++){}
        console.log(i); //报错
</script>
</html>

1.6 变量提升

猜你喜欢

转载自www.cnblogs.com/Jason-lin/p/9264993.html
今日推荐