javascript中作用域、全局作用域、局部作用域、隐式全局变量、块级作用域、作用域链、预解析
作用域
作用域指的是代碼的作用范圍,按照作用域劃分變量可分為全局變量和局部變量;作用域可分為:
全局作用域:
指全局變量作用的范圍;全局變量指的是通過var在函數(shù)外面聲明的變量,在js中任何位置都可以使用;但是在函數(shù)中通過var定義的變量,在函數(shù)外面是不可以使用的,也是局部變量;如果頁面不關(guān)閉,內(nèi)存就一直被占用,不能被 delete刪除。
<script>var num = 10;console.log(num); //10delete num;</script><script>console.log(num); //10</script>局部作用局:
指局部變量的作用范圍。局部變量指在函數(shù)中申明的變量,函數(shù)外面是不能訪問到的,當函數(shù)執(zhí)行完后,內(nèi)存就會被釋放。
<script>function f1() {var str = '函數(shù)中的字符串';console.log(str);};f1(); //函數(shù)中的字符串console.log('函數(shù)外面調(diào)用局部變量:' + str); //Uncaught ReferenceError: str is not defined at test.html:18</script>隱式全局變量:
指的是不通過關(guān)鍵字聲明的變量,函數(shù)中的隱式全局變量在外面也是能訪問到的,函數(shù)執(zhí)行完,內(nèi)存不會釋放;可以被delete刪除,隱式全局變量在變量出現(xiàn)前使用會報錯。
<script>function f1() {str = '函數(shù)中的字符串';// delete str;//可以被刪除console.log(str);};f1(); //函數(shù)中的字符串console.log('函數(shù)外面調(diào)用局部變量:' + str); //函數(shù)外面調(diào)用局部變量:函數(shù)中的字符串console.log(b); //報錯function f1() {b = 5;};f1();console.log(b); //5,如果函數(shù)不調(diào)用還是會報錯</script>塊級作用域:
指一對{ }里面區(qū)域,塊級作用域里面聲明的變量只能在這個塊級作用域使用,但是es5js中沒有塊級作用域,es6中有塊級作用域因此js中在{}里面定義的變量在外面任然可以使用,函數(shù)除外。
<script>if (true) {var num = 10;};console.log(num); //10for (var i = 0; i < 3; i++) {var str = '哈嘍';};console.log(str); //哈嘍</script>作用域鏈:
指當前作用的代碼會在當前作用域先找變量,如果沒有會一級一級往上找,如果0級作用域也沒有會報錯。
<script>//0級作用域:var num = 10;function f1() {//1級作用域:var num = 9;function f2() {//2級作用域:// var num = 8;function f3() {//3級作用域:// var num = 7;console.log(num); //9};f3();};f2();};f1();</script>預(yù)解析:
預(yù)解析(提前解析代碼)指:javascript解析器在解析javascript代碼時,把變量的聲明提前到當前作用域的最上面(注意函數(shù)表達式也算是變量)和函數(shù)的聲明提前到當前作用域的函數(shù)調(diào)用之前。
<script>console.log(num); //undefined,預(yù)解析代碼如下:var num = 5;// 預(yù)解析代碼:var num;console.log(num);num = 5;f1();var num = 10;function f1() {console.log(num); //undefinedvar num = 5;};// 預(yù)解析代碼:var num;function f1() {var num;console.log(num); //undefinednum = 5;};f1();num = 10;f1();console.log(b); //5console.log(c); //5console.log(a); //報錯function f1() {var a = b = c = 5;console.log(a); // 5console.log(b); // 5console.log(c); // 5};//預(yù)解析代碼:function f1() {var a;a = 5;b = 5;c = 5;console.log(a);console.log(b);console.log(c);};f1();console.log(b);console.log(c);console.log(a);console.log(f); //undefinedvar f = function() {var num = 5;console.log(num);};// 解析代碼如下:var f;console.log(f);f = function() {var num;num = 5;console.log(num);};</script>提示:本文圖片等素材來源于網(wǎng)絡(luò),若有侵權(quán),請發(fā)郵件至郵箱:810665436@qq.com聯(lián)系筆者 刪除。
筆者:苦海
總結(jié)
以上是生活随笔為你收集整理的javascript中作用域、全局作用域、局部作用域、隐式全局变量、块级作用域、作用域链、预解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: datagrip将一个数据库中的数据_跨
- 下一篇: java+路径拦截实现_SpringBo