JS函数.docx
- 文档编号:10116340
- 上传时间:2023-05-23
- 格式:DOCX
- 页数:22
- 大小:47.92KB
JS函数.docx
《JS函数.docx》由会员分享,可在线阅读,更多相关《JS函数.docx(22页珍藏版)》请在冰点文库上搜索。
JS函数
原文地址:
javascript的函数
∙作者:
F.Permadi
∙译者:
Sheneyan(子乌)
∙时间:
2006.01.03
∙英文原文:
INTRODUCTIONTOJavaScriptFunctions
子乌注:
一篇相当不错的function入门文章,个人感觉相当经典。
词语翻译列表function:
函数(Function未翻译)declare:
定义assign:
指派,分配functionbody:
函数体(就是函数的内容)object:
对象property:
属性unnamed:
匿名(在这里没翻译成未命名)objectorientedprogramming:
面相对相编程class:
类(比如后面的classdatatype我翻译成类数据类型)pointer:
指针reassign:
重新分配nest:
嵌套feature:
功能,特性local/global:
局部/全局blueprint:
蓝图(?
)userdefined:
用户自定义instance:
实例prototype:
原型(除了标题都不翻译)internal:
内部constructor:
构造器duplication:
复制函数:
定义有以下这些方法可以定义一个函数。
所有这些都是有效的,但是它们在后台如何实现的则有一些差别。
常用的写法一般大家都用这个写法来定义一个函数:
functionName([parameters]){functionBody};
ExampleD1:
Language:
javascript,parsedin:
0.005seconds,usingGeSHi1.0.7.12
functionadd(a,b)
{
returna+b;
}
alert(add(1,2)); //结果3
1.
运行示例
当我们这么定义函数的时候,函数内容会被编译(但不会立即执行,除非我们去调用它)。
而且,也许你不知道,当这个函数创建的时候有一个同名的对象也被创建。
就我们的例子来说,我们现在有一个对象叫做“add”(要更深入了解,看底下函数:
对象节。
)
匿名函数我们也可以通过指派一个变量名给匿名函数的方式来定义它。
ExampleD2
Language:
javascript,parsedin:
0.006seconds,usingGeSHi1.0.7.12
varadd=function(a,b)
{
returna+b;
}
alert(add(1,2)); //结果3
1.
运行示例
这个代码和前一个例子做了同样的事情。
也许语法看起来比较奇怪,但它应该更能让你感觉到函数是一个对象,而且我们只是为这个对指派了一个名称。
可以把它看做和varmyVar=[1,2,3]一样的语句。
以这种方式声明的函数内容也一样会被编译。
当我们指派一个这样的函数的时候,我们并不一定要求必须是匿名函数。
在这里,我作了和ExampleD2一样的事情,但我加了函数名“theAdd”,而且我可以通过调用函数名或者是那个变量来引用函数。
ExampleD2A
Language:
javascript,parsedin:
0.008seconds,usingGeSHi1.0.7.12
varadd=functiontheAdd(a,b)
{
returna+b;
}
alert(add(1,2)); //结果3
alert(theAdd(1,2)); //结果也是3
1.
运行示例
使用这种方式来定义函数在面向对象编程中是很有用的,因为我们能像底下这样使一个函数成为一个对象的属性。
Language:
javascript,parsedin:
0.005seconds,usingGeSHi1.0.7.12
varmyObject=newObject();
myObject.add=function(a,b){returna+b};
//myObject现在有一个叫做“add”的属性(或方法)
//而且我能够象下面这样使用它
myObject.add(1,2);
1.
new我们也能够通过使用运算符new来定义一个函数。
这是一个最少见的定义函数的方式并且并不推荐使用这种方式除非有特殊的理由(可能的理由见下)。
语法如下:
varName=newFunction([param1Name,param2Name,...paramNName],functionBody);
ExampleD3:
Language:
javascript,parsedin:
0.004seconds,usingGeSHi1.0.7.12
varadd=newFunction("a","b","returna+b;");
alert(add(3,4)); //结果7
1.
运行示例
我在这里有两个参数叫做a和b,而函数体返回a和b的和。
请注意newFunction(...)使用了大写F,而不是小写f。
这就告诉javascript,我们将要创建一个类型是Function的对象。
还要注意到,参数名和函数体都是作为字符串而被传递。
我们可以随心所欲的增加参数,javascript知道函数体会是右括号前的最后一个字符串(如果没有参数,你能够只写函数体)。
你没必要将所有东西都写在一行里(使用\或者使用字符串连接符+来分隔长代码)。
\标记告诉JavaScript在下一行查找字符串的其余部分。
例子如下:
ExampleD4
Language:
javascript,parsedin:
0.007seconds,usingGeSHi1.0.7.12
//注意"+"
//和"\"的不同用法
varadd=newFunction("a","b",
"alert"+
"('adding'+a+'and'+b);\
returna+b;");
alert(add(3,4)); //结果7
1.
javascript:
exampleD4();
采用这种方式定义函数会导致函数并没被编译,而且它有可能会比用其它方式定义的函数要慢。
至于为什么,看一下这个代码:
ExampleD5
Language:
javascript,parsedin:
0.022seconds,usingGeSHi1.0.7.12
functioncreateMyFunction(myOperator)
{
returnnewFunction("a","b","returna"+myOperator+"b;");
}
varadd=createMyFunction("+"); //创建函数"add"
varsubtract=createMyFunction("-"); //创建函数"subtract"
varmultiply=createMyFunction("*"); //创建函数"multiply"
//testthefunctions
alert("加的结果="+add(10,2)); //结果是12
alert("减的结果="+subtract(10,2)); //结果是8
alert("乘的结果="+multiply(10,2)); //结果是20
alert(add);
1.
运行示例
这个有趣的例子创建了三个不同的function,通过实时传递不同的参数来创建一个新Function。
因为编译器没法知道最终代码会是什么样子的,所以newFunction(...)的内容不会被编译。
那这有什么好处呢?
嗯,举个例子,如果你需要用户能够创建他们自己的函数的时候这个功能也许很有用,比如在游戏里。
我们也许需要允许用户添加“行为”给一个“player”。
但是,再说一次,一般情况下,我们应该避免使用这种形式,除非有一个特殊的目的。
函数:
对象函数是javascript中的一种特殊形式的对象。
它是第一个类数据类型。
这意味着我们能够给它增加属性。
这里有一些需要注意的有趣观点:
对象的创建就像刚才提及的,当我们定义一个函数时,javascript实际上在后台为你创建了一个对象。
这个对象的名称就是函数名本身。
这个对象的类型是function。
在下面的例子,我们也许不会意识到这一点,但我们实际上已经创建了一个对象:
它叫做Ball。
Example1
Language:
javascript,parsedin:
0.005seconds,usingGeSHi1.0.7.12
functionBall() //也许看起来有点奇怪,但是这个声明
{ //创建了一个叫做Ball的对象
i=1;
}
alert(typeofBall); //结果"function"
1.
运行示例
我们甚至能将这个对象的内容打印出来而且它会输出这个函数的实际代码,Example2:
点击alert(Ball);来看看Ball的内容。
属性的添加我们能够添加给Object添加属性,包括对象function。
因为定义一个函数的实质是创建一个对象。
我们能够“暗地里”给函数添加属性。
比如,我们这里定义了函数Ball,并添加属性callsign。
Language:
javascript,parsedin:
0.006seconds,usingGeSHi1.0.7.12
functionBall() //也许看起来有点奇怪,但是这个声明
{ //创建了一个叫做Ball的对象,而且你能够
} //引用它或者象下面那样给它增加属性
Ball.callsign="TheBall";//给Ball增加属性
alert(Ball.callsign);//输出"TheBall"
1.
运行示例
指针因为function是一个对象,我们能够为一个function分配一个指针。
如下例,变量ptr指向了对象myFunction。
Language:
javascript,parsedin:
0.005seconds,usingGeSHi1.0.7.12
functionmyFunction(message)
{
alert(message);
}
varptr=myFunction; //ptr指向了myFunction
ptr("hello"); //这句会执行myFunction:
输出"hello"
1.
运行示例
我们能够运行这个函数,就好像这个函数名已经被指针名代替了一样。
所以在上面,这行ptr("hello");和myFunction("hello");的意义是一样的。
指向函数的指针在面向对象编程中相当有用。
例如:
当我们有多个对象指向同一个函数的时候(如下):
Example4A
Language:
javascript,parsedin:
0.017seconds,usingGeSHi1.0.7.12
functionsayName(name)
{
alert(name);
}
varobject1=newObject(); //创建三个对象
varobject2=newObject();
varobject3=newObject();
object1.sayMyName=sayName; //将这个函数指派给所有对象
object2.sayMyName=sayName;
object3.sayMyName=sayName;
object1.sayMyName("object1"); //输出"object1"
object2.sayMyName("object2"); //输出"object2"
object3.sayMyName("object3"); //输出"object3"
1.
运行示例
因为只有指针被保存(而不是函数本身),当我们改变函数对象自身的时候,所有指向那个函数的指针都会发生变化。
我们能够在底下看到:
Example5:
Language:
javascript,parsedin:
0.015seconds,usingGeSHi1.0.7.12
functionmyFunction()
{
alert(myFunction.message);
}
myFunction.message="old";
varptr1=myFunction; //ptr1指向myFunction
varptr2=myFunction; //ptr2也指向myFunction
ptr1(); //输出"old"
ptr2(); //输出"old"
myFunction.message="new";
ptr1(); //输出"new"
ptr2(); //输出"new"
1.
运行示例
指针的指向我们能够在一个函数创建之后重新分配它,但是我们需要指向函数对象本身,而不是指向它的指针。
在下例中,我将改变myfunction()的内容。
Example6:
Language:
javascript,parsedin:
0.007seconds,usingGeSHi1.0.7.12
functionmyFunction()
{
alert("Old");
}
myFunction();//输出"Old"
myFunction=function()
{
alert("New");
};
myFunction();//输出"New"
1.
运行示例
旧函数哪里去了?
?
被抛弃了。
如果我们需要保留它,我们可以在改变它之前给它分配一个指针。
Example6A:
Language:
javascript,parsedin:
0.008seconds,usingGeSHi1.0.7.12
functionmyFunction()
{
alert("Old");
}
varsavedFuncion=myFunction;
myFunction=function()
{
alert("New");
};
myFunction(); //输出"New"
savedFuncion(); //输出"Old"
1.
运行示例
不过要小心,象下面这样的例子并不会有作用,因为是创建了另一个叫做myFunctionPtr的函数而不是修改它。
Example6B:
Language:
javascript,parsedin:
0.009seconds,usingGeSHi1.0.7.12
functionmyFunction()
{
alert("Old");
}
varsavedFunc=myFunction;
savedFunc=function()
{
alert("New");
};
myFunction(); //输出"Old"
savedFunc(); //输出"New"
1.
运行示例
内嵌函数我们还能够在一个函数中嵌套一个函数。
下例,我有一个叫做getHalfOf的函数,而在它里面,我有另一个叫做calculate的函数。
Example7
Language:
javascript,parsedin:
0.015seconds,usingGeSHi1.0.7.12
functiongetHalfOf(num1,num2,num3)
{
functioncalculate(number)
{
returnnumber/2;
}
varresult="";
result+=calculate(num1)+"";
result+=calculate(num2)+"";
result+=calculate(num3);
returnresult;
}
varresultString=getHalfOf(10,20,30);
alert(resultString); //输出"51015"
1.
运行示例
你只能在内部调用嵌套的函数。
就是说,你不能这么调用:
getHalfOf.calculate(10),因为calculate只有当外部函数(getHalfOf())在运行的时候才会存在。
这和我们前面的讨论一致(函数会被编译,但只有当你去调用它的时候才会执行)。
调用哪个函数?
你也许正在想命名冲突的问题。
比如,下面哪一个叫做calculate的函数会被调用?
Example8
Language:
javascript,parsedin:
0.017seconds,usingGeSHi1.0.7.12
functioncalculate(number)
{
returnnumber/3;
}
functiongetHalfOf(num1,num2,num3)
{
functioncalculate(number)
{
returnnumber/2;
}
varresult="";
result+=calculate(num1)+"";
result+=calculate(num2)+"";
result+=calculate(num3);
returnresult;
}
varresultString=getHalfOf(10,20,30);
alert(resultString); //输出"51015"
1.
运行示例
在这个例子中,编译器会首先搜索局部内存地址,所以它会使用内嵌的calculate函数。
如果我们删除了这个内嵌(局部)的calculate函数,这个代码会使用全局的calculate函数。
函数:
数据类型及构造函数让我们来看看函数的另一个特殊功能--这让它和其它对象类型截然不同。
一个函数能够用来作为一个数据类型的蓝图。
这个特性通常被用在面向对象编程中来模拟用户自定义数据类型(userdefineddatatype)。
使用用户自定义数据类型创建的对象通常被成为用户自定义对象(userdefinedobject)。
数据类型在定义了一个函数之后,我们也同时创建了一个新的数据类型。
这个数据类型能够用来创建一个新对象。
下例,我创建了一个叫做Ball的新数据类型。
ExampleDT1
Language:
javascript,parsedin:
0.004seconds,usingGeSHi1.0.7.12
functionBall()
{
}
varball0=newBall();//ball0现在指向一个新对象
alert(ball0); //输出"Object",因为ball0现在是一个对象
1.
运行示例
这样看来,ball0=newBall()作了什么?
new关键字创建了一个类型是Object的新对象(叫做ball0)。
然后它会执行Ball(),并将这个引用传给ball0(用于调用对象)。
下面,你会看到这条消息:
“creatingnewBall”,如果Ball()实际上被运行的话。
ExampleDT2
Language:
javascript,parsedin:
0.009seconds,usingGeSHi1.0.7.12
functionBall(message)
{
alert(message);
}
varball0=newBall("creatingnewBall"); //创建对象并输出消息
ball0.name="ball-0"; //ball0现在有一个属性:
name
alert(ball0.name); //输出"ball-0"
1.
运行示例
我们可以把上面这段代码的高亮的一行看做是底下的代码高亮处的一个简写:
Language:
javascript,parsedin:
0.010seconds,usingGeSHi1.0.7.12
functionBall(message)
{
alert(message);
}
varball0=newObject();
ball0.construct=Ball;
ball0.construct("creatingnewball"); //执行ball0.Ball("creating..");
ball0.name="ball-0";
alert(ball0.name);
1.
运行示例
这行代码ball0.construct=Ball和Example4中的ptr=myFunction语法一致。
如果你还是不明白这行的含义那就回过头再复习一下Example4。
注意:
你也许考虑直接运行ball0.Ball("..."),但是它不
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JS 函数