JavaScript進階程式設計 讀書筆記之八 Function類及閉包

來源:互聯網
上載者:User

Function類

定義
  Function類可以表示開發人員定義的任何函數,用Function類直接建立函數的文法如下:

var function_name=new Function(agrument1,agrument2,...,argumentN,function_body);
  每個argument都是一個參數,最後一個參數是函數主體(要執行的代碼)。

  樣本: 複製代碼 代碼如下:function sayHi(sName,sMessage){
alert("Hello "+sName+","+sMessage);
}

還可以如下定義它:
var sayHi=new Function("sName","sMessage","alert(\"Hello\"+sName+\",\"+sMessage);");
  註:儘管可用Function建構函式建立函數,但最好不要使用它,因為用它定義函數比用傳統方式要慢得多。不過,所有函數都應看作是Function類的執行個體。
屬性和方法
  因為函數是參考型別,所以它們也有屬性和方法,ECMAScript定義的屬性length聲明了函數期望的參數個數,例如: 複製代碼 代碼如下:function doAdd(iNum){
alert(iNum+10);
}
function sayHi(){
alert("Hi");
}
alert(doAdd.length);//outpus 1
alert(sayHi.length);//outpus 0

Function對象也有與所有對象共用的標準valueOf()方法和toString()方法,這兩個方法返回的都是函數的原始碼,在調試時尤其有用。
  例如: 複製代碼 代碼如下:function doAdd(iNum){
alert(iNum+10);
}
alert(doAdd.toString());

這段代碼輸出了doAdd()函數的文本。
閉包
定義
  所謂閉包,是指詞法表示包括不必計算的變數的函數,也就是說,該函數能使用函數外定義的變數。在ECMAScript中使用全域變數是一個簡單的閉包執行個體。
  樣本: 複製代碼 代碼如下:var sMessage="Hello World";
function sayHelloWold(){
alert(sMessage);
}
sayHelloWorld();

在一個函數中定義另一個函數會使閉包變得更複雜,如: 複製代碼 代碼如下:var iBaseNum=10;
function addNumbers(iNum1,iNum2){
function doAddtion(){
return iNum1+iNum2+iBaseNum;
}
return doAddtion();
}

這裡函數addNumbers()包括函數doAddtion()(閉包)。內建函式是個閉包,因為它將擷取外部函數的參數iNum1和iNum2以及全域變數iBaseNum的值。addNumbers()的最後一步調用了內建函式,把兩個參數和全域變數相加,並返回它們的和。這裡要掌握的重要概念是doAddtion()函數根本不接受參數,它使用的是從執行環境中擷取的。
  可以看到,閉包是ECMAScript中非常強大多用的一部分,可以用於執行複雜的計算。就像使用任何進階函數一樣,在使用閉包時要當心,因為它們可能會變得非常複雜。
本文範例程式碼 複製代碼 代碼如下:<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>《JavaScript進階程式設計》讀書筆記之八:Function類及閉包</title>
<script type="text/javascript">
function doAdd(iNum){
alert(iNum+10);
}
function sayHi(){
alert("Hi");
}
function lengthProperty(){
alert(doAdd.length);
alert(sayHi.length);
}
function valueOfMethod(){
alert(doAdd.valueOf());
}
function toStringMethod(){
alert(doAdd.toString());
}
var sMessage="Hello World";
function sayHelloWorld(){
alert(sMessage);
}
function demoOne(){
sayHelloWorld();
}
var iBaseNum=10;
function addNumbers(iNum1,iNum2){
function doAddtion(){
return iNum1+iNum2+iBaseNum;
}
return doAddtion();
}
function demoTwo(){
alert(addNumbers(1,2));
}
</script>
</head>
<body>
<h1>Length:</h1>
<input type="button" onclick="lengthProperty()" value="LengthProperty"/>
<h1>valueOf()/toString():</h1>
<input type="button" onclick="valueOfMethod()" value="ValueOfMethod"/>
<input type="button" onclick="toStringMethod()" value="ToStringMethod"/>
<h1>閉包:</h1>
<input type="button" onclick="demoOne()" value="Demo One"/>
<input type="button" onclick="demoTwo()" value="Demo Two"/>
</body>

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.