javascript
javascript 之作用域-06
作用域
作用域:是指變量可訪問的范圍,他規定了如何查找變量,也就是確定當前執行代碼對變量的訪問權限。
作用域有兩種工作模式:
靜態作用域 :又稱為詞法作用域,在編譯階段就可以決定變量的引用,由程序定義的位置決定,和代碼執行順序無關,用嵌套的方式解析。
動態作用域 :在程序運行時候,和代碼的執行順序決定,用動態棧動態管理。
JavaScript采用詞法作用域,也就是說函數的執行依賴于變量的作用域,這個作用域是在函數定義時決定的,而不是函數調用時決定的;
靜態作用域與動態作用域
JavaScript 采用的是詞法作用域,函數的作用域在函數編譯階段就確定了。
1 <script> 2 var a = 10; 3 function run() { 4 console.log(a);//10 5 } 6 function fo() { 7 var a = 20; 8 run(); 9 } 10 fo(); 11 </script>執行 run函數,先從run 函數內部查找是否有局部變量 a,如果沒有,就根據代碼書寫位置,向上查找變量a,也就是a等于10,所以結果會打印 10。
假設JavaScript采用動態作用域,讓我們分析下執行過程:
執行run 函數,依然是從run 函數內部查找是否有局部變量 a。如果沒有,就從調用函數的作用域,也就是fo函數內部查找 a變量,所以結果會打印 20。
前面我們已經說了,JavaScript采用的是靜態作用域,所以這個例子的結果是 10。
全局作用域、函數作用域
ES5在詞法作用域工作模式(一種規則)下又分為全局作用域和函數作用域,沒有塊作用域(es6以后有)。
全局作用域:該作用域的變量、對象在任何地方都是可見的,變量沒有在函數內聲明或者聲明的時候沒有帶var就是全局變量,擁有全局作用域,window對象的所有屬性擁有全局作用域,在代碼任何地方都可以訪問。
在客戶端javascript 中,表示的瀏覽器窗口中window對象充當了全局對象,擁有全局作用域。
1 <script> 2 var a = 10; 3 function run() { 4 console.log(a);//10 5 } 6 function fo() { 7 var a = 20; 8 run(); 9 } 10 fo(); 11 </script> 12 <script> 13 console.log(a)//10 14 </script>全局變量a ,在run函數以及第二個<script>代碼塊中也是可見的;
函數作用域:在函數內聲明的變量,那么在函數內及其子函數內都是可見的,在函數外是不可見的。
1 function fo(){ 2 var myName='Joel'; 3 } 4 console.log(myName)//ReferenceError: myName is not defined塊級作用域是指在{...}內的代碼塊,每一段代碼塊都有各自的作用域,且聲明的變量在代碼塊外是不可見的 如:
1 function run(){ 2 var a=10; 3 if(true){ 4 var b=10; 5 } 6 console.log(b);//如果存在塊作用域,那么這里打印這個b是會報錯的 7 }?
總結
單純的作用域還是好理解,javascript的作用域是靜態作用域,即應該關心代碼的位置而不是調用的位置 如:
1 <script> 2 var x=10; 3 function fn(){ 4 console.log(x); 5 } 6 function show(f){ 7 var x=20; 8 (function(){ 9 f() 10 }()); 11 } 12 show(fn);//10 13 </script>?
轉載于:https://www.cnblogs.com/CandyManPing/p/7744514.html
總結
以上是生活随笔為你收集整理的javascript 之作用域-06的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 01.FFmpeg下载以及安装
- 下一篇: gradle idea java ssm