欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

javascript的函數(shù)第1/3頁(yè)

 更新時(shí)間:2006年07月28日 00:00:00   作者:  

作者:F. Permadi
譯者:Sheneyan(子烏)
英文原文: INTRODUCTION TO JavaScript Functions
中文譯文(包括示例):javascript的函數(shù)
子烏注:一篇相當(dāng)不錯(cuò)的function入門(mén)文章,個(gè)人感覺(jué)相當(dāng)經(jīng)典。

詞語(yǔ)翻譯列表:

function:函數(shù)(Function未翻譯)
declare:定義
assign:指派,分配
functionbody:函數(shù)體(就是函數(shù)的內(nèi)容)
object:對(duì)象
property:屬性
unnamed:匿名(在這里沒(méi)翻譯成未命名)
object oriented programming:面相對(duì)相編程
class:類(lèi)(比如后面的class data type我翻譯成類(lèi)數(shù)據(jù)類(lèi)型)
pointer:指針
reassign:重新分配
nest:嵌套
feature:功能,特性
local/global:局部/全局
blueprint:藍(lán)圖(?)
user defined:用戶自定義
instance:實(shí)例
prototype:原型(除了標(biāo)題都不翻譯)
internal:內(nèi)部
constructor:構(gòu)造器
duplication:

函數(shù):定義

有以下這些方法可以定義一個(gè)函數(shù)。所有這些都是有效的,但是它們?cè)诤笈_(tái)如何實(shí)現(xiàn)的則有一些差別。

常用的寫(xiě)法

一般大家都用這個(gè)寫(xiě)法來(lái)定義一個(gè)函數(shù):

CODE:
functionName([parameters]){functionBody};

Example D1:

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

當(dāng)我們這么定義函數(shù)的時(shí)候,函數(shù)內(nèi)容會(huì)被編譯(但不會(huì)立即執(zhí)行,除非我們?nèi)フ{(diào)用它)。而且,也許你不知道,當(dāng)這個(gè)函數(shù)創(chuàng)建的時(shí)候有一個(gè)同名的對(duì)象也被創(chuàng)建。就我們的例子來(lái)說(shuō),我們現(xiàn)在有一個(gè)對(duì)象叫做“add”(要更深入了解,看底下函數(shù):對(duì)象節(jié)。)

匿名函數(shù)

我們也可以通過(guò)指派一個(gè)變量名給匿名函數(shù)的方式來(lái)定義它。

Example D2

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

這個(gè)代碼和前一個(gè)例子做了同樣的事情。也許語(yǔ)法看起來(lái)比較奇怪,但它應(yīng)該更能讓你感覺(jué)到函數(shù)是一個(gè)對(duì)象,而且我們只是為這個(gè)對(duì)指派了一個(gè)名稱(chēng)??梢园阉醋龊?var myVar=[1,2,3]一樣的語(yǔ)句。以這種方式聲明的函數(shù)內(nèi)容也一樣會(huì)被編譯。

當(dāng)我們指派一個(gè)這樣的函數(shù)的時(shí)候,我們并不一定要求必須是匿名函數(shù)。在這里,我作了和ExampleD2一樣的事情,但我加了函數(shù)名“theAdd”,而且我可以通過(guò)調(diào)用函數(shù)名或者是那個(gè)變量來(lái)引用函數(shù)。

Example D2A

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

使用這種方式來(lái)定義函數(shù)在面向?qū)ο缶幊讨惺呛苡杏玫?,因?yàn)槲覀兡芟竦紫逻@樣使一個(gè)函數(shù)成為一個(gè)對(duì)象的屬性。

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

我們也能夠通過(guò)使用運(yùn)算符new來(lái)定義一個(gè)函數(shù)。這是一個(gè)最少見(jiàn)的定義函數(shù)的方式并且并不推薦使用這種方式除非有特殊的理由(可能的理由見(jiàn)下)。語(yǔ)法如下:

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

Example D3:

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

我在這里有兩個(gè)參數(shù)叫做a和b,而函數(shù)體返回a和b的和。請(qǐng)注意new Function(...)使用了大寫(xiě)F,而不是小寫(xiě)f。 這就告訴javascript,我們將要?jiǎng)?chuàng)建一個(gè)類(lèi)型是Function的對(duì)象。 還要注意到,參數(shù)名和函數(shù)體都是作為字符串而被傳遞。我們可以隨心所欲的增加參數(shù),javascript知道函數(shù)體會(huì)是右括號(hào)前的最后一個(gè)字符串(如果沒(méi)有參數(shù),你能夠只寫(xiě)函數(shù)體)。你沒(méi)必要將所有東西都寫(xiě)在一行里(使用\或者使用字符串連接符+來(lái)分隔長(zhǎng)代碼)。\標(biāo)記告訴JavaScript在下一行查找字符串的其余部分。例子如下:

Example D4

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

采用這種方式定義函數(shù)會(huì)導(dǎo)致函數(shù)并沒(méi)被編譯,而且它有可能會(huì)比用其它方式定義的函數(shù)要慢。至于為什么,看一下這個(gè)代碼:

Example D5

CODE:

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

var add=createMyFunction("+");                // 創(chuàng)建函數(shù) "add"
var subtract=createMyFunction("-");           // 創(chuàng)建函數(shù) "subtract"
var multiply=createMyFunction("*");           // 創(chuàng)建函數(shù) "multiply"
// test the functions
alert("加的結(jié)果="+add(10,2));                  // 結(jié)果是 12
alert("減的結(jié)果="+subtract(10,2));             // 結(jié)果是 8
alert("乘的結(jié)果="+multiply(10,2));             // 結(jié)果是 20
alert(add);

 

這個(gè)有趣的例子創(chuàng)建了三個(gè)不同的function,通過(guò)實(shí)時(shí)傳遞不同的參數(shù)來(lái)創(chuàng)建一個(gè)新Function。因?yàn)榫幾g器沒(méi)法知道最終代碼會(huì)是什么樣子的,所以new Function(...)的內(nèi)容不會(huì)被編譯。那這有什么好處呢?嗯,舉個(gè)例子,如果你需要用戶能夠創(chuàng)建他們自己的函數(shù)的時(shí)候這個(gè)功能也許很有用,比如在游戲里。我們也許需要允許用戶添加“行為”給一個(gè)“player”。但是,再說(shuō)一次,一般情況下,我們應(yīng)該避免使用這種形式,除非有一個(gè)特殊的目的。

函數(shù):對(duì)象

函數(shù)是javascript中的一種特殊形式的對(duì)象。它是第一個(gè)[b〕類(lèi)數(shù)據(jù)類(lèi)型(class data type)。這意味著我們能夠給它增加屬性。這里有一些需要注意的有趣觀點(diǎn):

對(duì)象的創(chuàng)建

就像剛才提及的,當(dāng)我們定義一個(gè)函數(shù)時(shí),javascript實(shí)際上在后臺(tái)為你創(chuàng)建了一個(gè)對(duì)象。這個(gè)對(duì)象的名稱(chēng)就是函數(shù)名本身。這個(gè)對(duì)象的類(lèi)型是function。在下面的例子,我們也許不會(huì)意識(shí)到這一點(diǎn),但我們實(shí)際上已經(jīng)創(chuàng)建了一個(gè)對(duì)象:它叫做Ball。

Example 1

CODE:
function Ball()       // 也許看起來(lái)有點(diǎn)奇怪,但是這個(gè)聲明
{                     // 創(chuàng)建了一個(gè)叫做Ball的對(duì)象
  i=1;
}                    
alert(typeof Ball);     // 結(jié)果 "function"

我們甚至能將這個(gè)對(duì)象的內(nèi)容打印出來(lái)而且它會(huì)輸出這個(gè)函數(shù)的實(shí)際代碼,Example2: 點(diǎn)擊 alert(Ball);來(lái)看看Ball的內(nèi)容。

屬性的添加

我們能夠添加給Object添加屬性,包括對(duì)象function。因?yàn)槎x一個(gè)函數(shù)的實(shí)質(zhì)是創(chuàng)建一個(gè)對(duì)象。我們能夠“暗地里”給函數(shù)添加屬性。比如,我們這里定義了函數(shù)Ball,并添加屬性callsign。

CODE:
function Ball()       // 也許看起來(lái)有點(diǎn)奇怪,但是這個(gè)聲明
{                     // 創(chuàng)建了一個(gè)叫做Ball的對(duì)象,而且你能夠
}                     // 引用它或者象下面那樣給它增加屬性
Ball.callsign="The Ball"; // 給Ball增加屬性
alert(Ball.callsign); // 輸出 "The Ball"

指針

因?yàn)閒unction是一個(gè)對(duì)象,我們能夠?yàn)橐粋€(gè)function分配一個(gè)指針。如下例,變量ptr指向了對(duì)象myFunction。

CODE:
function myFunction(message)
{
  alert(message);
}
var ptr=myFunction;  // ptr指向了myFunction
ptr("hello");         // 這句會(huì)執(zhí)行myFunction:輸出"hello"

我們能夠運(yùn)行這個(gè)函數(shù),就好像這個(gè)函數(shù)名已經(jīng)被指針名代替了一樣。所以在上面,這行ptr("hello"); 和myFunction("hello");的意義是一樣的。

指向函數(shù)的指針在面向?qū)ο缶幊讨邢喈?dāng)有用。例如:當(dāng)我們有多個(gè)對(duì)象指向同一個(gè)函數(shù)的時(shí)候(如下):

Example 4A

CODE:
function sayName(name)
{
  alert(name);
}
var object1=new Object();      // 創(chuàng)建三個(gè)對(duì)象
var object2=new Object();
var object3=new Object();
object1.sayMyName=sayName;       // 將這個(gè)函數(shù)指派給所有對(duì)象
object2.sayMyName=sayName;
object3.sayMyName=sayName;

object1.sayMyName("object1");    // 輸出 "object1"
object2.sayMyName("object2");    // 輸出 "object2"
object3.sayMyName("object3");    // 輸出 "object3"

因?yàn)橹挥兄羔槺槐4妫ǘ皇呛瘮?shù)本身),當(dāng)我們改變函數(shù)對(duì)象自身的時(shí)候,所有指向那個(gè)函數(shù)的指針都會(huì)發(fā)生變化。我們能夠在底下看到:

Example 5:

CODE:

function myFunction()
{
  alert(myFunction.message);
}
myFunction.message="old";
var ptr1=myFunction;                 // ptr1 指向 myFunction
var ptr2=myFunction;                 // ptr2 也指向 myFunction

ptr1();                     // 輸出 "old"
ptr2();                              // 輸出 "old"

myFunction.message="new";

ptr1();                     // 輸出 "new"
ptr2();                              // 輸出 "new"

相關(guān)文章

最新評(píng)論