JavaScript變量作用域之我見
相信大家都知道,JavaScript中變量作用域只有兩種,全局作用域與函數(shù)中的局部作用域(有人認(rèn)為不同script節(jié)點(diǎn)間也存在一種作用域,稱之為段作用域,理由是在后面的script的節(jié)點(diǎn)中定義的變量,在這個script節(jié)點(diǎn)沒有被解析之前,前面的script節(jié)點(diǎn)是不能訪問這個變量的,這種依賴于代碼解析順序的特殊情況,不在我們這篇文章的討論之列)。
比如下面的代碼:
- var a = 1;
- function f(b)
- {
- var c = 2;
- }
a就是我們聲明的全局變量,c就是我們聲明的局部變量,b作為函數(shù)f的形參,也是一個局部變量。
我們再看下面的代碼:
- function outer()
- {
- var o;
- function inner()
- {
- var i;
- }}
可以看到o和i都是局部變量,只不過o的作用域范圍為函數(shù)outer的函數(shù)體,而i的作用域范圍為inner的函數(shù)體。
我們再看一段代碼:
- var g = 1;
- function outer(){
- var o = 1;
- function inner(){
- var i = 1;
- debugger;
- }
- inner();
- }
- outer();
debugger?沒錯,就是debugger。呵呵,我們單獨(dú)運(yùn)行這段代碼,打開瀏覽器的調(diào)試環(huán)境,比如ff瀏覽器的firebug
我們選擇腳本這一項(xiàng),然后查看debugger運(yùn)行時的調(diào)用堆棧情況,可以看到,除了有inner,outer以外,還有一個scope1.html()這么一個函數(shù),這個函數(shù)從何而來的?
我們再看如下代碼:
- debugger;
可以看到,單獨(dú)運(yùn)行debugger的時候,firebug的調(diào)用堆棧只有一個scope1.html()這個函數(shù)被調(diào)用。
我們知道,此時是沒有任何自定義的函數(shù)被調(diào)用的,那么這個函數(shù)從何而來的?我們不妨做如下大膽猜測,這是瀏覽器的js引擎自動生成的,我們所有的代碼都運(yùn)行在一個瀏覽器預(yù)先定義的一個函數(shù)里,而在這個函數(shù)里聲明的變量,就是我們所謂的全局變量。
這樣,我們就可以以一種一致的方式,去看待JavaScript代碼:所有的代碼都是以函數(shù)方式運(yùn)行的,JavaScript的變量作用域只有一種,那就是函數(shù)的局部作用域。
以上言論純屬個人意見,有不同見解,歡迎拍磚。
ps:
1 關(guān)于scrope1.html()這個函數(shù),在不同的調(diào)試環(huán)境下,命名可能不一樣,比如ie下就是global script code,chrome下就是anonymous function。
2 推薦大家都運(yùn)行一下上面的代碼,查看一下函數(shù)運(yùn)行時的調(diào)用堆棧以及變量的監(jiān)控情況,對于理解JavaScript的作用域、作用域鏈、閉包等概念都有很大的幫助。
原文鏈接:http://www.cnblogs.com/rt0d/archive/2011/04/18/2019242.html
【編輯推薦】