JAVASCRIPT函數(shù)作用域和提前聲明 分享
更新時間:2013年08月22日 15:04:44 作者:
這篇文章介紹了JAVASCRIPT函數(shù)作用域和提前聲明,有需要的朋友可以參考一下
一些語言如C、java都有塊級作用域,即花括號內(nèi)的每一段代碼都具有各自的作用域,而且變量在聲明它們的代碼段之外是不可見的,但是javascript沒有塊級作用域。javascript使用函數(shù)作用域,即變量在聲明它們的函數(shù)體以及這個函數(shù)體嵌套的任意函數(shù)體內(nèi)都是有定義的,也即函數(shù)內(nèi)聲明的所有變量在函數(shù)體內(nèi)始終是可見的。這樣就意味著變量在聲明之前就可以使用,這個特性被稱為"聲明提前",即javascript函數(shù)里聲明的所有變量都被提前至函數(shù)的頂部。來看個例子。
var test1 = "globalVariable";
function test(){
console.log(test1);
var test1 = "localVariable";
console.log(test1);
}
上述函數(shù)執(zhí)行的結(jié)果是:先輸出"undefined",再輸出"localVariable"。
很多人都會誤以為結(jié)果是:先輸出"globalVariable,再輸出localVariable"。其實不然,由于函數(shù)作用域的特性,局部變量在整個函數(shù)體始終是有定義的,也即,在函數(shù)體內(nèi)局部變量遮蓋了同名全局變量,但是只有在程序執(zhí)行到var語句的時候,局部變量才會被真正的賦值。因此,上述過程相當(dāng)于,將函數(shù)內(nèi)的變量聲明提前至函數(shù)體頂部,同時變量初始化留在原來的位置。就相當(dāng)于如下這個函數(shù)
var test1 = "globalVariable";
function test(){
var test1; //將函數(shù)內(nèi)的變量聲明提前至函數(shù)頂部
console.log(test1);
test1 = "localVariable"; //賦值
console.log(test1);
}
但是,如果函數(shù)內(nèi)沒有用var聲明變量,情況又有所不同。
var test1 = "globalVariable";
function test(){
console.log(test1);
test1 = "localVariable";
console.log(test1);
}
這個函數(shù)執(zhí)行的結(jié)果是:先輸出"globalVariable",再輸出"localVariable"。
由于函數(shù)體內(nèi)的test1變量沒有用var聲明,就默認為全局變量,當(dāng)然就不存在變量提前聲明的問題。第一行就會輸出"globalVariable",而第三行改變了test1全局變量的值,輸出了"localVariable"。
復(fù)制代碼 代碼如下:
var test1 = "globalVariable";
function test(){
console.log(test1);
var test1 = "localVariable";
console.log(test1);
}
上述函數(shù)執(zhí)行的結(jié)果是:先輸出"undefined",再輸出"localVariable"。
很多人都會誤以為結(jié)果是:先輸出"globalVariable,再輸出localVariable"。其實不然,由于函數(shù)作用域的特性,局部變量在整個函數(shù)體始終是有定義的,也即,在函數(shù)體內(nèi)局部變量遮蓋了同名全局變量,但是只有在程序執(zhí)行到var語句的時候,局部變量才會被真正的賦值。因此,上述過程相當(dāng)于,將函數(shù)內(nèi)的變量聲明提前至函數(shù)體頂部,同時變量初始化留在原來的位置。就相當(dāng)于如下這個函數(shù)
復(fù)制代碼 代碼如下:
var test1 = "globalVariable";
function test(){
var test1; //將函數(shù)內(nèi)的變量聲明提前至函數(shù)頂部
console.log(test1);
test1 = "localVariable"; //賦值
console.log(test1);
}
但是,如果函數(shù)內(nèi)沒有用var聲明變量,情況又有所不同。
復(fù)制代碼 代碼如下:
var test1 = "globalVariable";
function test(){
console.log(test1);
test1 = "localVariable";
console.log(test1);
}
這個函數(shù)執(zhí)行的結(jié)果是:先輸出"globalVariable",再輸出"localVariable"。
由于函數(shù)體內(nèi)的test1變量沒有用var聲明,就默認為全局變量,當(dāng)然就不存在變量提前聲明的問題。第一行就會輸出"globalVariable",而第三行改變了test1全局變量的值,輸出了"localVariable"。
相關(guān)文章
javaScript 事件綁定、事件冒泡、事件捕獲和事件執(zhí)行順序整理總結(jié)
這篇文章主要介紹了javaScript 事件綁定、事件冒泡、事件捕獲和事件執(zhí)行順序整理總結(jié)的相關(guān)資料,需要的朋友可以參考下2016-10-10JavaScript中splice與slice的區(qū)別
本文給大家分享的是JavaScript中的splice和slice的用法和區(qū)別,slice()方法和splice()方法都是原生js中對數(shù)組操作的方法,下面我們來詳細探討下2017-05-05JavaScript DOM 學(xué)習(xí)第三章 內(nèi)容表格
在這一章我會解釋我的網(wǎng)站上的所有頁面都在運行的內(nèi)容表格的代碼。他會生產(chǎn)這個頁面的所有h3和h4的列表,然后給他們添加一個鏈接。2010-02-02Javascript開發(fā)之三數(shù)組對象實例介紹
Javascript開發(fā)之三組數(shù)對象詳細介紹,需要的朋友可以參考下2012-11-11