js作用域小記var變數和function區別

2022-08-30 15:15:20 字數 984 閱讀 7139

首先來乙個例子做實驗

function

created();

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掉了。

預編譯後的**會如下:

function

created(),

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 位...