菜鳥js進階---我理解的函式作用域
阿新 • • 發佈:2018-12-30
其實之前大學有學習過,net和c++的語法,現在已經忘記的差不多。現在撿起來JS的語法,雖然不陌生,但是現在還是要努力的學習下。
js的函式構造貌似跟C的構造有點像。格式都是
function functionName(arg0,arg1,......,argn){
statements
}
//上面這是一個函式的結構,下面這個例子是一個簡單的函式
function sayHi(){
return("Hello World!");
}
以上的例子呢,這個函式沒有引數傳入。其實是可以在sayHi()函式內部放寫引數的,如果不給這個引數傳值,預設是undifined資料型別。
每個方法都是有自己的一個預設的物件的,這個物件的名字叫做‘arguments’,然而你在函式上傳入的引數,也都是以陣列的形式儲存在這個物件上。例如下面這段程式碼
function demo(name,sex){
console.log(arguments.length); //2
console.log(arguments[0]); //name
}
demo('name','sex');
這塊跟作用域沒有一點關係,,,接下來咱們來說說js的函式作用域。
我理解的js函式作用域就是----兒子可以啃老,但是老子不能拿兒子的變數。怎麼說呢。來咱們上demo
var color = 'blue'; //全域性變數 function changeColor(){ if (color ==='blue'){ color = 'green'; }else{ color = 'red'; } } changeColor(); console.log(color); //green
在這個簡單的函式changeColor() 中,作用域鏈包含兩個物件,一個是自家的變數物件arguments和全域性環境下的變數物件。可以在函式內部訪問到color,就是因為可以在這個作用域鏈上找到它。
書中還有一個函式內部巢狀函式的例子,能更好的解釋這個作用域鏈,但是我覺得這個其實已經夠理解了。就寫這個啦,就是我之前說的,兒子可以向老子要東西,可是老子就是拿不到兒子的東西。不管巢狀再深,子集函式總是能訪問到父級函式定義的變數。