首先來乙個例子做實驗
functioncreated();
return
dir;
function
myctrl ()
var yourctrl = function
();}
var d =created();
d.ctrl();
d.ctrl2();
可以猜一下輸出結果
//輸出:
d.ctrl(); //輸出:my ctrl
d.ctrl2(); //輸出: uncaught typeerror: d.ctrl2 is not a function首先以上例子中的寫法其實不太符合規範,變數及函式的定義最好都放在前邊。
var的function的宣告是不同的, var的宣告會讓變數宣告提公升到作用域頂部,但是變數的賦值還是在原位, 所以變數賦值如果在return後,也不會執行。 而function宣告的話,會全部提公升到頂部執行。
所以,created() 裡邊的 yourctrl變數實際是undefined 還沒有來的及賦值即return掉了。
預編譯後的**會如下:
functioncreated(),
ctrl2: yourctrl
},yourctrl;
return
dir;
yourctrl = function
();}
js預編譯時,會掃瞄作用域, 將作用域內的函式宣告提公升到作用域頂部。而執行**還在原位。
例如
function()經過預編譯後,會變成:
function
()
即使這個var a在if的花括號內,也會被提前。
所以,我們常常強調的編碼規範還是很有存在意義的!
作用域變數 var
var沒有塊級作用域,定義後在當前閉包中都可以訪問,如果變數名重複,就會覆蓋前面定義的變數,並且也有可能被其他人更改。變數名重複,就會覆蓋前面定義的變數,並且也有可能被其他人更改 console.log a function a function a 輸出 2 定義後在當前閉包中都可以訪問 if t...
js變數和作用域
一 變數型別 i 100 number型別 i abc string型別 i object型別 i 1,2,3 array型別 二 變數宣告 var i 100 顯示宣告 i 100 隱示宣告 在函式內部使用var關鍵字宣告的變數為區域性變數 沒有使用var關鍵字,直接賦值宣告的是全域性變數 當我們...
js變數和作用域
2.變數值的比較 3.引數的傳遞 4.型別檢測 二 js變數的作用域與解析 基本資料型別 基本資料型別的值不能被修改,其值儲存在棧中,當變數賦予新的值,棧中的值被覆蓋 引用資料型別 引用資料型別的值可以被修改,其位址儲存在棧中,值儲存在堆中棧堆 基本資料型別a值 引用資料型別 b位址1 位址1c 位...