1. 程式人生 > >菜鳥js進階---我理解的函式作用域

菜鳥js進階---我理解的函式作用域

其實之前大學有學習過,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,就是因為可以在這個作用域鏈上找到它。

書中還有一個函式內部巢狀函式的例子,能更好的解釋這個作用域鏈,但是我覺得這個其實已經夠理解了。就寫這個啦,就是我之前說的,兒子可以向老子要東西,可是老子就是拿不到兒子的東西。不管巢狀再深,子集函式總是能訪問到父級函式定義的變數。