javascript的作用域以及闭包现象

Posted jason-lin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 变量提升

 

以上是关于javascript的作用域以及闭包现象的主要内容,如果未能解决你的问题,请参考以下文章

javascript函数作用域闭包以及匿名函数2

JavaScript中的作用域和闭包

JavaScript之作用域和闭包

你不知道的JavaScript(作用域和闭包)

JavaScript函数,作用域以及闭包

JavaScript ---- 闭包(什么是闭包,为什么使用闭包,闭包的作用)