標籤:列表 子函數 return highlight 自訂對象 val 堆棧 not tac
function myFunc(theObject) { theObject.make = "Toyota";}var mycar = {make: "Honda", model: "Accord", year: 1998},var x, y;x = mycar.make; // x擷取的值為 "Honda"myFunc(mycar);y = mycar.make; // y擷取的值為 "Toyota" // (make屬性被函數改變了)
函式宣告:1.函數名稱 2.參數列表 3.函數功能
定義一個函數:
var number = 10;
function square(number){
number = number*number; return number ; }
var x = square(number);
console.log(number);//10
console.log(x);//100
函數名 square
參數number
函數功能 返回number^2
原始參數 和 對象作為參數(上面兩組代碼為執行個體)
1.當原始參數作為函數參數的時候,函數內部改變該參數不影響全域或調用函數
2.如果參數為一個對象,Array或者自訂對象,函數內部改變該對象屬性,則這樣的改變對函數外部可見。
函數運算式
/*匿名函數的函數運算式*/var square = function(number) { return number * number};var x = square(4);/*有函數名的函數運算式*/var factorial = function fac(n) {return n<2 ? 1 : n*fac(n-1)};console.log(factorial(3));
函數作為參數
function map(f,a) { var result = [], // 建立一個新的數組 i; for (i = 0; i != a.length; i++) result[i] = f(a[i]); return result;}
函數f()作為map()函數的參數
map(function(x) {return x * x * x}, [0, 1, 2, 5, 10]);
返回 [0, 1, 8, 125, 1000]。
function hoisting即函數提升僅作用於函式宣告 不能用於函數運算式
console.log(square(5));/* ... */function square(n) { return n*n }
console.log(square); // square is hoisted with an initial value undefined.console.log(square(5)); // TypeError: square is not a functionvar square = function (n) { return n * n; }
函數範圍
函數可以訪問自己內部定義的變數或者函數,全域可以訪問所有在全域範圍中定義的變數或函數
子函數可以訪問父函數內部定義的變數或者其父函數有權訪問的其他變數。
範圍和函數堆棧(scope and function stack)
遞迴(recursion)
一個函數可以指向並調用自身的三種方法:
1.函數名
2.arguments.callee
3.範圍下的一個指向該函數的變數名
嵌套函數和閉包(nested functions and closures)
你可以在一個函數裡面嵌套另外一個函數。嵌套(內部)函數對其容器(外部)函數是私人的。它自身也形成了一個閉包(closure)。一個閉包是一個可以自己擁有獨立的環境與變數的的運算式(通常是函數)。
既然嵌套函數是一個閉包,就意味著一個嵌套函數可以”繼承“容器函數的參數和變數。換句話說,內建函式包含外部函數的範圍。
可以總結如下:
- 內建函式只可以在外部函數中訪問。
- 內建函式形成了一個閉包:它可以訪問外部函數的參數和變數,但是外部函數卻不能使用它的參數和變數。
JavaScript學習筆記(一)函數