js 函數總結

來源:互聯網
上載者:User

標籤:

函數的基本文法如下所示:

function functionName(arg0, arg1,...,argN) {

statements

} 函數如果有傳回值則return 後的語句將不會被執行,傳回值可以直接在return語句中實現,沒有return返回的undefined

函數中的參數:

1.函數中不介意傳遞的參數個數和參數的類型,函數中的參數其實是一個數組,可以通過arguments 來訪問參數

2.函數中的參數不能重載,ECMAScript 中定義了兩個名字相同的函數,則該名字只屬於後定義的函數

Function類型

函數實際上是Function類型的執行個體,函數名相當於只想函數對象的指標,它與其他參考型別一樣有屬性和方法。

由於函數名僅僅是指向函數的指標,因此函數名與包含對象指標的其他變數沒有什麼不同。函數作為另一個函數的參數或者另一個函數的傳回值(函數的嵌套)換句話

說,一個函數可能會有多個名字,如下面的例子所示。

function sum(num1, num2){

return num1 + num2;

}

alert(sum(10,10)); //20

var anotherSum = sum;

alert(anotherSum(10,10)); //20

sum = null;

alert(anotherSum(10,10)); //20

FunctionTypeExample01.htm

以上代碼首先定義了一個名為sum()的函數,用於求兩個值的和。然後,又聲明了變數anotherSum,

並將其設定為與sum 相等(將sum 的值賦給anotherSum)。注意,使用不帶圓括弧的函數名是訪問函

數指標,而非調用函數。此時,anotherSum 和sum 就都指向了同一個函數,因此anotherSum()也

可以被調用並返回結果。即使將sum 設定為null,讓它與函數“斷絕關係”,但仍然可以正常調用

anotherSum()。ECMAScript 中的函數名本身就是變數,所以函數也可以作為值來使用。也就是說,不僅可以像傳遞參數一樣把一個函數傳遞給另一個函數,而且可以將一個函數作為另一個函數的結果返回。

函式宣告三種方法:

function sum (num1, num2) {

return num1 + num2;

}

函數運算式聲明

var sum = function(num1, num2){

return num1 + num2;

};

一種定義函數的方式是使用 Function 建構函式。Function 建構函式可以接收任意數量的參數,

但最後一個參數始終都被看成是函數體,而前面的參數則枚舉出了新函數的參數。來看下面的例子:

var sum = new Function("num1", "num2", "return num1 + num2"); // 不推薦

函數運算式和函式宣告的比較

函式宣告提升:在函數執行前,解析器會先讀取函數的聲明 ,再調用相應函數

函數內部的對象:this(函數執行環境的對象),arguments(類數組對象,儲存函數的參數)

函數內部的屬性length:函數中接受參數的個數,prototype

函數內部的方法:apply ()和call()

。這兩個方法的用途都是在特定的作

用域中調用函數,實際上等於設定函數體內this 對象的值。首先,apply()方法接收兩個參數:一個

是在其中運行函數的範圍,另一個是參數數組。其中,第二個參數可以是Array 的執行個體,也可以是

arguments 對象。例如:

function sum(num1, num2){

return num1 + num2;

}

function callSum1(num1, num2){

return sum.apply(this, arguments); // 傳入arguments 對象

}

function callSum2(num1, num2){

return sum.apply(this, [num1, num2]); // 傳入數組

}

alert(callSum1(10,10)); //20

alert(callSum2(10,10)); //20

在strict 模式下,未指定環境對象而調用函數,則this 值不會轉型為window。

除非明確把函數添加到某個對象或者調用apply()或call(),否則this 值將是

undefined。

apply()和call()真正的用武之地;它們真正強大的地方是能夠擴充函數

賴以啟動並執行範圍

 

匿名函數: 建立的 函數賦值給變數

http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html

http://www.cnblogs.com/rainman/archive/2009/05/04/1448899.html

(全域變數會儲存在記憶體中,局部變數函數執行後會被銷毀) 區分好全域和局部

閉包:閉包是指有權訪問另一個函數範圍中的變數的函數(函數嵌套)。由於閉包會攜帶包含它的函數的範圍,),範圍鏈終點的全域執行環境 作用:可以在函數外部讀取函數內部的局部變數,另一個就是讓這些變數的值始終保持在記憶體中。(即閉包指的是函數嵌套中的內建函式所以這些變數指外部函數中包含的變數)

因此會比其他函數佔用更多的記憶體

 

閉包副作用:,即閉包只能取得包含函數中任何變數的最後一個值

function createFunctions(){

var result = new Array();

for (var i=0; i < 10; i++){

result[i] = function(){

return i;

};

}

return result;

}//都是返回10

 

function createFunctions(){

var result = new Array();

for (var i=0; i < 10; i++){

result[i] = function(num){

return function(){

return num;

};

}(i);

}

return result;

}//1,2,3…..10

遞迴函式(一個函數通過名字調用自身

function factorial(num){

if (num <= 1){

return 1;

} else {

return num * factorial(num-1);

}

}

。雖然這個函數表面看來沒什麼問題,但下面的代碼卻可能導致它出錯。

var anotherFactorial = factorial;

factorial = null;

alert(anotherFactorial(4)); //出錯!

arguments.callee 是一個指向正在執行的函數的指標,因此可以用它來實現對函數

的遞迴調用

function factorial(num){

if (num <= 1){

return 1;

} else {

return num * arguments.callee(num-1);

}

在strict 模式下,不能通過指令碼訪問arguments.callee,訪問這個屬性會導致錯誤。不過,可

以使用命名函數運算式來達成相同的結果。例如:

var factorial = (function f(num){

if (num <= 1){

return 1;

} else {

return num * f(num-1);

}

});

js 函數總結

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.