javascript變數範圍之我見

來源:互聯網
上載者:User

相信大家都知道,javascript中變數範圍只有兩種,全域範圍與函數中的局部範圍(有人認為不同script節點間也存在一種範圍,稱之為段範圍,理由是在後面的script的節點中定義的變數,在這個script節點沒有被解析之前,前面的script節點是不能訪問這個變數的,這種依賴於代碼解析順序的特殊情況,不在我們這篇文章的討論之列)。

比如下面的代碼:

var a = 1;
function f(b){
var c = 2;
}

a就是我們聲明的全域變數,c就是我們聲明的局部變數,b作為函數f的形參,也是一個局部變數。

我們再看下面的代碼:

function outer(){
var o;
function inner(){
var i;
}
}

可以看到o和i都是局部變數,只不過o的範圍範圍為函數outer的函數體,而i的範圍範圍為inner的函數體。

我們再看一段代碼:

var g = 1; function outer(){     var o = 1;     function inner(){         var i = 1;         debugger;     }     inner(); } outer();

debugger?沒錯,就是debugger。呵呵,我們單獨運行這段代碼,開啟瀏覽器的調試環境,比如ff瀏覽器的firebug

我們選擇指令碼這一項,然後查看debugger運行時的呼叫堆疊情況,可以看到,除了有inner,outer以外,還有一個scope1.html()這麼一個函數,這個函數從何而來的?

我們再看如下代碼:

debugger;

可以看到,單獨運行debugger的時候,firebug的呼叫堆疊只有一個scope1.html()這個函數被調用。

我們知道,此時是沒有任何自訂的函數被調用的,那麼這個函數從何而來的?我們不妨做如下大膽猜測,這是瀏覽器的js引擎自動產生的,我們所有的代碼都運行在一個瀏覽器預先定義的一個函數裡,而在這個函數裡聲明的變數,就是我們所謂的全域變數。

這樣,我們就可以以一種一致的方式,去看待javascript代碼:所有的代碼都是以函數方式啟動並執行,javascript的變數範圍只有一種,那就是函數的局部範圍。

以上言論純屬個人意見,有不同見解,歡迎拍磚。

ps:

1  關於scrope1.html()這個函數,在不同的調試環境下,命名可能不一樣,比如ie下就是global script code,chrome下就是anonymous function。

2  推薦大家都運行一下上面的代碼,查看一下函數運行時的呼叫堆疊以及變數的監控情況,對於理解javascript的範圍、範圍鏈、閉包等概念都有很大的協助。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.