1. 程式人生 > >javascript的作用域以及閉包現象

javascript的作用域以及閉包現象

n) 1.5 函數作用域 log var head clas express immediate

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的作用域以及閉包現象