javascript的函數(2)

來源:互聯網
上載者:User

匿名函數

我們也可以通過指派一個變數名給匿名函數的方式來定義它。

Example D2

CODE:
var add=function(a, b)
{                    
  return a+b;
}                    
alert(add(1,2));        // 結果 3

這個代碼和前一個例子做了同樣的事情。也許文法看起來比較奇怪,但它應該更能讓你感覺到函數是一個對象,而且我們只是為這個對指派了一個名稱。可以把它看做和 var myVar=[1,2,3]一樣的語句。以這種方式聲明的函數內容也一樣會被編譯。

當我們指派一個這樣的函數的時候,我們並不一定要求必須是匿名函數。在這裡,我作了和ExampleD2一樣的事情,但我加了函數名“theAdd”,而且我可以通過調用函數名或者是那個變數來引用函數。

Example D2A

CODE:
var add=function theAdd(a, b)
{                    
  return a+b;
}                    
alert(add(1,2));           // 結果 3
alert(theAdd(1,2));        // 結果也是 3

使用這種方式來定義函數在物件導向編程中是很有用的,因為我們能像底下這樣使一個函數成為一個對象的屬性。

CODE:
var myObject=new Object();
myObject.add=function(a,b){return a+b}; 
// myObject 現在有一個叫做“add”的屬性(或方法)
// 而且我能夠象下面這樣使用它
myObject.add(1, 2);

我們也能夠通過使用運算子new來定義一個函數。這是一個最少見的定義函數的方式並且並不推薦使用這種方式除非有特殊的理由(可能的理由見下)。文法如下:

CODE:
varName=new Function([param1Name, param2Name,...paramNName], functionBody);

Example D3:

CODE:
var add=new Function("a", "b", "return a+b;");
alert(add(3,4));        // 結果 7

我在這裡有兩個參數叫做a和b,而函數體返回a和b的和。請注意new Function(...)使用了大寫F,而不是小寫f。 這就告訴javascript,我們將要建立一個類型是Function的對象。 還要注意到,參數名和函數體都是作為字串而被傳遞。我們可以隨心所欲的增加參數,javascript知道函數體會是右括弧前的最後一個字串(如果沒有參數,你能夠唯寫函數體)。你沒必要將所有東西都寫在一行裡(使用\或者使用字串串連符+來分隔長代碼)。\標記告訴JavaScript在下一行尋找字串的其餘部分。例子如下:

Example D4

CODE:
var add=new Function("a", "b",
  "alert" +                      // 注意 "+"
  "('adding '+a+' and ' +b);\    // 和 "\"的不同用法
   return a+b;");
alert(add(3,4));        // 結果 7

採用這種方式定義函數會導致函數並沒被編譯,而且它有可能會比用其它方式定義的函數要慢。至於為什麼,看一下這個代碼:

Example D5

CODE:

function createMyFunction(myOperator)
{
  return new Function("a", "b", "return a" + myOperator + "b;");
}

var add=createMyFunction("+");                // 建立函數 "add"
var subtract=createMyFunction("-");           // 建立函數 "subtract"
var multiply=createMyFunction("*");           // 建立函數 "multiply"
// test the functions
alert("加的結果="+add(10,2));                  // 結果是 12
alert("減的結果="+subtract(10,2));             // 結果是 8
alert("乘的結果="+multiply(10,2));             // 結果是 20
alert(add);

 

這個有趣的例子建立了三個不同的function,通過即時傳遞不同的參數來建立一個新Function。因為編譯器沒法知道最終代碼會是什麼樣子的,所以new Function(...)的內容不會被編譯。那這有什麼好處呢?嗯,舉個例子,如果你需要使用者能夠建立他們自己的函數的時候這個功能也許很有用,比如在遊戲裡。我們也許需要允許使用者添加“行為”給一個“player”。但是,再說一次,一般情況下,我們應該避免使用這種形式,除非有一個特殊的目的。

相關文章

聯繫我們

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