function 的宣告 , 如下兩種均可
1>function doSomeThing(y){}
2>var doSomeThing = function (y) {}
Ex1> function 宣告, [函式宣告]方式定義的函式可以在宣告前使用:
square(2); // 4 function square(number) {
return number * number;
}
Ex2: function 宣告, [變數定義的函式] 不可以在宣告前使用:
square(2); // TypeError: square is not a function
var square = function (number) {
return number * number;
};
Ex1: 函式內的變數宣告
var x = 1;
var doSomeThing = function(y) {
var x = 100;
return x + y; };
console.log( doSomeThing(50) ); // 150
console.log( x ); // 1
--> 同 function doSomeThing(y) { var x=100; return x+y;}
-->
因為切分變數有效範圍的最小單位是 "function",所以-->
在函式區塊內透過 var 定義的 x 實際上只屬於這個函式。
換句話說,外面的 x 跟 function 內的 x 其實是兩個不同的變數。
-->
自己的 function 內如果找不到,就會一層層往外找,直到全域變數為止:
function
可以讀取外層已經宣告的變數,
但外層拿不到裡面宣告的變數。Ex2: 函式的變數宣告
var x = 1; var doSomeThing = function(y) {
x = 100;
return x + y; };
console.log( doSomeThing(50) ); // 150
console.log( x ); // 100
Ex3: 函式的變數宣告
var x = 1; var doSomeThing = function(y) {
console.log(x); // 會出現什麼?
var x = 100;
return x + y; };
console.log( doSomeThing(50) ); // 150
console.log( x ); // undefined
-->
要是不小心在 var 宣告前就使用了這個變數,這時候 JavaScript就會開始尋找變數 x 了,在自己的 scope 找... 啊,找到了!
雖然是在下面,但可以確認的是自己的 scope 裡面有宣告,
於是就 很貼心地 「只會把宣告的語法」拉到這個 scope 的「最上面」...
-->如上寫法同下:
var doSomeThing = function(y) { var x;
console.log(x); // undefined
x = 100; return x + y;
};
-->
變數都盡量在 scope 的最上面先宣告完成後再使用。
二.全域變數/區域變數
1>全域變數
JavaScript 這門語言中,沒有所謂「全域變數」這種東西。
更準確地說,
更準確地說,
我們所說的「全域變數」其實指的是「全域物件」(或者叫「頂層物件」) 的屬性。
以瀏覽器來說,「全域物件」指的就是 window,在 node 環境中則叫做 global。Ex:
var a = 10; console.log( window.a ); // 10
- 變數有效範圍 (scope) 的最小切分單位是 function (ES6 的 let 與 const 例外)
即使是寫在函式內,沒有 var 的變數會變成「全域變數」
全域變數指的是全域物件 (頂層物件) 的「屬性」
敘述句 (Statement):敘述句就是執行某個動作 ,
Ex: var foo;
運算式 (Expression): 運算式最大的特性,就是它會產生一個「值」。
Ex: var a = 10 * 10;在運算式中,會透過提供一些數值給「運算子」(Operator) 進行運算,進而得到一個運算的結果。
沒有留言:
張貼留言