天天看點

JavaScript權威設計--JavaScript變量,作用域,聲明提前(簡要學習筆記四)

1.宿主對象與宿主環境

宿主對象:由ecmascript實作的宿主環境提供的對象,可以了解為:浏覽器提供的對象。所有的bom和dom都是宿主對象。

宿主環境:一般宿主環境由外殼程式建立與維護,隻要能提供js引擎執行的環境都可稱之為外殼程式。如:web浏覽器等。

2.日期的轉換

3.變量的聲明

var i;

var sum;

或者

var i,sum;

這些沒有賦初始值的對象,初始值就是undefined

4.在函數體内,局部變量的優先級高于同名的全局變量。并且同名局部變量會修改(覆寫)全局同名變量的值。

5.函數作用域與聲明提前

分析一個例子,如下:

了解:可能你覺得為什麼第一個輸出是"undefined",你可能覺得應該輸出"glob"。因為scp上面定義的是全局變量啊。

全局變量在js中的任何地方都是起作用的,為什麼這裡出問題了呢?

首先,正如第四點所說。全局變量scp與局部變量scp同名,是以局部變量scp覆寫全局變量scp.

然後,你又困惑,代碼當時不是隻是執行到第一個輸出語句麼,還沒執行到下面的var scp="loca"麼?這時我們要明白一點。

js的函數作用域是指在函數内聲明的所有變量在函數體内部是可見的!

正如這個例子,函數内部定義的scp無論是在var scp="loca"上面還是在下面。是都存在的!

如果你不信,你可以這麼測試一下:

JavaScript權威設計--JavaScript變量,作用域,聲明提前(簡要學習筆記四)

如果b沒有的話,顯示的沒有被定義而不是輸出"undefined"。

我們上面說過函數聲明後沒有賦初始值,預設其初始值就是"undefined"。

可見f()函數内部 scp 是存在的。隻是沒有初始化。直到後面初始化"loca"。

其實上面的例子真是的情況應該是這樣:

JavaScript權威設計--JavaScript變量,作用域,聲明提前(簡要學習筆記四)
JavaScript權威設計--JavaScript變量,作用域,聲明提前(簡要學習筆記四)

scp 這種情況也叫“聲明提前”。

下面這種情況有點意思!

JavaScript權威設計--JavaScript變量,作用域,聲明提前(簡要學習筆記四)
JavaScript權威設計--JavaScript變量,作用域,聲明提前(簡要學習筆記四)

轉載:http://www.cnblogs.com/zqzjs/p/4796242.html

繼續閱讀