关于变量作用域的一点整理
案例一:
1 var x=100; 2 alert(x); 3 //等同于 4 window.x=100; 5 window.alert(x);理解:定義的全局變量都是window對象的屬性,而一些像alert()這樣的默認(rèn)方法為window對象下的方法。
案例二:
1 alert(x);//彈出undefined 2 var x="yewenxiang"; 3 4 function test(){ 5 alert(x); 6 var x="yewenxiang"; 7 } 8 test();//彈出undefined等價于:
1 var x; 2 alert(x);//彈出undefined 3 x="yewenxiang"; 4 5 function test(){ 6 var x; 7 alert(x); 8 x="yewenxiang"; 9 } 10 test()//彈出undefined理解:Javascript引擎會先掃描整個函數(shù),把所有變量的聲明提升到函數(shù)體頂部,在函數(shù)外面也是會先把全局變量的申明提升到頂部,這個叫變量的提升。
案例三:
1 alert(typeof test); 2 var test=function (){}; 3 //彈出undefined; 4 //等價于 5 var test 6 alert(typeof test); 7 var test=function (){};
alert(typeof test);function test(){}; //彈出function; 等價于 function test(){}; alert(typeof test);理解:函數(shù)也會像變量一樣被提升,不同的是對于函數(shù)聲明和定義同時提到前面,而變量只是把聲明提到了前面,定義沒有提前。
案例四:
1 var x="yewenxiang"; 2 function test(){ 3 var y="xiangwang"; 4 function test2(){ 5 var z="tiandongxue"; 6 function test3(){ 7 alert(x); 8 } 9 test3(); 10 } 11 test2(); 12 } 13 test();//彈出yewenxiang;?理解:函數(shù)首先在test3()中查找是否定義了變量x,沒有,去上一層test2中查找,沒有,再去test1中去找,繼續(xù)沒有,跑函數(shù)外面找去了,OK終于找到了var x="yewenxiang",函數(shù)內(nèi)查找變量屬于就近原則.
1 var x="yewenxiang"; 2 function test(){ 3 var y="xiangwang"; 4 var x; 5 function test2(){ 6 var z="tiandongxue"; 7 function test3(){ 8 alert(x); 9 } 10 test3(); 11 } 12 test2(); 13 } 14 test();//彈出undefined理解:Javascript也喜歡偷懶,我既然可以在內(nèi)部找到var x,何必跑出去找var x="yewenxiang".符合函數(shù)內(nèi)局部變量的優(yōu)先級比全局變量高。
案例五:
function test(){var x="yewenxiang";}test();alert(x);//x is not defined //因為在函數(shù)內(nèi)部定義var為局部變量,只能在函數(shù)內(nèi)部使用。function test(){x="yewenxiang";}test();alert(x); //彈出yewenxiang ,不加var,相當(dāng)于定義了一個全局變量,沒調(diào)用函數(shù)時報錯x is not defined, //調(diào)用函數(shù)后彈出yewenxiang(注意嚴(yán)格模式下調(diào)用函數(shù)也會報錯x is not defined)。function test(){x="yewenxiang";}alert(x);test(); //報錯x is not defined 個人理解只要彈出前沒調(diào)用函數(shù)都報錯。var x="xiangwang"function test(){x="yewenxiang";}test();alert(x); //彈出yewenxiang 函數(shù)內(nèi)部的全局變量覆蓋了外面定義的var x="xiangwang", //這種情況下嚴(yán)格模式也沒報錯,因為函數(shù)外面定義了全局變量x。案例六:
function test(){var i=1;if(i){var j=0;for(var k=0;k<3;k++){alert(k);//0,1,2 }alert(k);//3 }alert(j);//j }test(); //i j k 作用域是相同的,在函數(shù)test內(nèi)是全局的,都可被訪問。 function test(){let i=1;if(i){let j=0;for(lef k=0;k<3;k++){alert(k);alert(i);}alert(k);}alert(j);}test();//按順序彈出0-1-1-1-2-1-報錯k is not defined-報錯j is not defined理解:let為ES6新增的,解決ES5之前沒有塊級作用域的問題,這兩段段代碼說明:函數(shù)中的for if while等中定義的var變量,在函數(shù)中屬于全局變量,都可以被訪問。而定義為let,只能在內(nèi)層去往外層訪問定義的let變量,外層訪問不了內(nèi)層定義的let變量.
碰到的坑1:
1 function test(){ 2 name="yewenxiang"; 3 } 4 alert(name); 5 //彈出一個空的對話框。 6 ------------------------------ 7 function test(){ 8 name="yewenxiang"; 9 } 10 test(); 11 alert(name);//彈出yewenxiang 12 //然后刪除test() 刷新頁面還是彈出yewenxiang ,然后關(guān)閉頁面重新加載測試頁面彈出空的對話框執(zhí)行的結(jié)果跟我預(yù)料的不一樣,我認(rèn)為的是第一段代碼應(yīng)該報錯name為未定義,第二段刪除test()后也應(yīng)該會報錯,但是修改代碼后刷新頁面還是彈出yewenxiang,然后關(guān)閉頁面重新加載測試頁面彈出空的對話框這種詭異的事情,最后發(fā)現(xiàn)問題所在:因為name屬于Javascript 內(nèi)置的對象、屬性和方法的名稱,應(yīng)該避免使用保留字,換成x后正常。
目前未解決坑2:
1 function test(){ 2 alert(x); 3 x="yewenxiang"; 4 } 5 test(); 6 //報錯x is not defined, 如果加var 則變量會提升彈出undefined,不加var 變量為什么沒有提升而是直接報錯。以上是我對于變量作用域的一些理解和總結(jié),包括未解決的問題,理解中有錯誤還希望能指出。
轉(zhuǎn)載于:https://www.cnblogs.com/yewenxiang/p/6002077.html
總結(jié)
以上是生活随笔為你收集整理的关于变量作用域的一点整理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。