區(qū)別:在全局作用域中,變量在整個(gè)頁(yè)面腳本中都是可見(jiàn)的,可以被自由訪問(wèn)。在局部作用域中,變量?jī)H能在聲明的函數(shù)內(nèi)部可見(jiàn),函數(shù)外是不允許訪問(wèn)的;函數(shù)執(zhí)行完畢之后,局部作用域銷毀。
本教程操作環(huán)境:windows7系統(tǒng)、javascript1.8.5版、Dell G3電腦。
變量范圍,可稱為“變量作用域(Scope)”,是指變量在程序中可以訪問(wèn)的有效范圍,也稱為變量的可見(jiàn)性。
作用域
1、什么是作用域(Scope)
通常來(lái)說(shuō),一段程序代碼中所用到的名字不總是有效和可用的,而限定這個(gè)名字的可用性的代碼范圍就是這個(gè)名字的作用域。
JS作用域:就是代碼名字(變量)作用的范圍
作用域的目的:是為了提高程序的可靠性,更重要的是減少命名沖突
2、JS的作用域的分類(ES6之前)
JS作用域可以分為兩大類:全局作用域 、局部作用域(函數(shù)作用域)
1)全局作用域:
直接編寫(xiě)在 script 標(biāo)簽之中的JS代碼,都是全局作用域;
或者是一個(gè)單獨(dú)的 JS 文件中的。
全局作用域在頁(yè)面打開(kāi)時(shí)創(chuàng)建,頁(yè)面關(guān)閉時(shí)銷毀;
在全局作用域中有一個(gè)全局對(duì)象 window(代表的是一個(gè)瀏覽器的窗口,由瀏覽器創(chuàng)建),可以直接使用。
在全局作用域中,
- 所有創(chuàng)建的變量都會(huì)作為 window 對(duì)象的屬性保存。
- 所有創(chuàng)建的函數(shù)都會(huì)作為 window 對(duì)象的方法保存。
2)局部作用域(函數(shù)作用域):
在函數(shù)內(nèi)部就是局部作用域,這個(gè)代碼的名字只在函數(shù)的內(nèi)部起作用
調(diào)用函數(shù)時(shí)創(chuàng)建函數(shù)作用域,函數(shù)執(zhí)行完畢之后,函數(shù)作用域銷毀;
每調(diào)用一次函數(shù)就會(huì)創(chuàng)建一個(gè)新的函數(shù)作用域,它們之間是相互獨(dú)立的。
實(shí)例分析:
在這個(gè)例子里面 un函數(shù)里面的 局部作用域中 有一個(gè) num 變量,script 標(biāo)簽的全局作用域中也有一個(gè) num變量。
(一個(gè)在全局作用域下,另一個(gè)在局部作用域下,雖然兩個(gè)變量的變量名相沖突,但是并沒(méi)有影響。)
所以,在不同的作用域下,變量名相同也不受影響,這樣就很有效的減少了命名沖突。
<script> var num = 10; function nu(){ var num = 20; console.log(num); } nu(); console.log(num); </script>
JS現(xiàn)階段(ES6之前)沒(méi)有塊級(jí)作用域,被塊級(jí)作用域就是用大括號(hào)({})包含的就是塊級(jí)作用域。
二、變量的作用域
JavaScript 變量可以分為全局變量和局部變量:
-
全局變量:變量在整個(gè)頁(yè)面腳本中都是可見(jiàn)的,可以被自由訪問(wèn);其作用域?yàn)槿肿饔糜颉?/p>
-
局部變量:變量?jī)H能在聲明的函數(shù)內(nèi)部可見(jiàn),函數(shù)外是不允許訪問(wèn)的;其作用域?yàn)榫植孔饔糜颉?/p>
示例1
下面示例演示了全局變量和局部變量的關(guān)系。
var a = 1; //聲明并初始化全局變量 function f(){ //聲明函數(shù) document.write(a); //顯示undefined var a = 2; //聲明并初始化局部變量 document.write(a); //顯示 2 } f(); //調(diào)用函數(shù)
由于在函數(shù)內(nèi)部聲明了一個(gè)同名局部變量 a,所以在預(yù)編譯期,JavaScript 使用該變量覆蓋掉全局變量在函數(shù)內(nèi)部的影響。而在執(zhí)行初期,局部變量 a 未賦值,所以在函數(shù)內(nèi)第 1 行代碼讀取局部變量 a 的值也就是 undefined 了。當(dāng)執(zhí)行到函數(shù)第 2 行代碼時(shí),為局部變量賦值 2,所以在第 3 行中就顯示為 2。
示例2
下面示例演示了如果不顯式聲明局部變量所帶來(lái)的后果。
var jQuery = 1; (function () { jQuery = window.jQuery = window.$ = function(){}; })() document.write(jQuery); //顯示函數(shù)代碼:function(){}
因此,在函數(shù)體內(nèi)使用全局變量是一種危險(xiǎn)的行為。為了避免此類問(wèn)題,應(yīng)該養(yǎng)成在函數(shù)體內(nèi)使用 var 語(yǔ)句顯式聲明局部變量的習(xí)慣。
【推薦學(xué)習(xí):javascript高級(jí)教程】