2022年8月31日 星期三

JS function - var 變數宣告, 及scope變數的範圍 - 全域變數/區域變數

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) 進行運算,進而得到一個運算的結果。

沒有留言:

張貼留言