JavaScript 申明函数的三种方法 每个函数就是一个对象(一)


Posted in Javascript onDecember 04, 2009

一、申明函数的三种方法 (Declaring a Function)
方法一:function functionName([parameters]){functionBody};

Example D1

function add(a, b) 
{ 
return a+b; 
} 
alert(add(1,2)); // produces 3

当我们这样申明函数时,函数的内容被解释(但没有执行,要我们调用该函数才会执行),同时,一个名为add的对象已经建立。

方法二:将一个未命名的函数function赋给一个指定变量(var)

Example D2

var add=function(a, b) 
{ 
return a+b; 
} 
alert(add(1,2)); // produces 3

这种申明的语法看起来怪异,但它可以帮助我们更好地理解“函数即对象”。通过这种方式申明的函数的内容,同样是被解释,而未被执行。
同时,我们还可以这样定义:

Example D2A:

var add=function theAdd(a, b) 
{ 
return a+b; 
} 
alert(theAdd(1,2)); // produces 3 
alert(add(1,2)); // also produces 3

由上面一个例子可以看出,我们既可以通过函数名theAdd调用函数,也可以通过指定的函数变量名add调用函数。

Example D2B:

var myObject=new Object(); 
myObject.add=function(a,b){return a+b}; 
// myObject now has a property/a method named "add" 
// and I can use it like below 
myObject.add(1, 2);

而这个例子表明,当我们需要将一个自定义函数作为某个对象的属性时,这种函数申明方法是非常有用的,它更接近OOP的思想。

方法三:使用new运算符申明函数

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

Example D3:

var add=new Function("a", "b", "return a+b;"); 
alert(add(3,4)); // produces 7

这里有两个参数a和b,以及一个函数体,返回a+b。同时请注意,new Function(……),这里使用的是大写Function,而不是小写function,这就表明,我们是要建立一个Function对象(回想下new Object()建立一个Object对象)。同时,我们也可以看出,前面的参数名和后面的函数体都是通过字符串形式传递(注意:它们都加了双引号)。我们可以有许多个参数,JavaScript会自动判别函数体,通常是离右边括号最近的那一个参数。当然,我们不一定非得将所有的代码写在同一行,我们可以分多行写,中间使用“+”或者“\”进行联接。“+”和“\”告诉我们,JavaScript将要在下一行寻找剩余的代码。

Example D3A

var add=new Function("a", "b", 
"alert" + // chop string using "+" 
"('adding '+a+' and ' +b);\ // separate string using "\" 
return a+b;"); 
alert(add(3,4)); // produces 7

当然,通过这种方式申明函数,函数体没有被解释(要直到运行时才被解释),这样便导致了性能的降低。为什么呢?请看下面的例子:

Example D3B

function createMyFunction(myOperator) 
{ 
return new Function("a", "b", "return a" + myOperator + "b;"); 
} 
var add=createMyFunction("+"); // creates "add" function 
var subtract=createMyFunction("-"); // creates "subtract" function 
var multiply=createMyFunction("*"); // created "multiply" function 
// test the functions 
alert("result of add="+add(10,2)); // result is 12 
alert("result of substract="+subtract(10,2)); // result is 8 
alert("result of multiply="+multiply(10,2)); // result is 20 
alert(add);

这个例子比较有趣,它在执行时可以通过传递参数(myOperator)分别创建了三个不同的Function对象。然后解释器在意图解释createMyFunction的时候,对return中的“运算符”具体是什么不清楚,从而无法解释,这样,性能自然打了折扣。
当然,当我们有特殊用途,如允许用户去创建他们自定义的函数时,我们可以采用这种函数申明方式,不过我们还是应尽量避免这样使用。

Javascript 相关文章推荐
一个用js实现的页内搜索代码
May 23 Javascript
Jquery css函数用法(判断标签是否拥有某属性)
May 28 Javascript
杨氏矩阵查找的JS代码
Mar 21 Javascript
非jQuery实现照片散落桌子上,单击放大的LightBox效果
Nov 28 Javascript
javascript异步编程代码书写规范Promise学习笔记
Feb 11 Javascript
10条建议帮助你创建更好的jQuery插件
May 18 Javascript
javascript表单验证大全
Aug 12 Javascript
js实现显示当前状态的导航效果代码
Aug 28 Javascript
JQuery EasyUI的一些常用组件
Jul 12 jQuery
Angular CLI在Angular项目中如何使用scss详解
Apr 10 Javascript
vue实现lodop打印功能的示例
Nov 11 Javascript
vuex Module将 store 分割成模块的操作
Dec 07 Vue.js
javascript 跳转代码集合
Dec 03 #Javascript
javascript KeyDown、KeyPress和KeyUp事件的区别与联系
Dec 03 #Javascript
javascript json 新手入门文档
Dec 03 #Javascript
js 屏蔽鼠标右键脚本附破解方法
Dec 03 #Javascript
33种Javascript 表格排序控件收集
Dec 03 #Javascript
javascript 面向对象全新理练之原型继承
Dec 03 #Javascript
javascript 面向对象全新理练之继承与多态
Dec 03 #Javascript
You might like
ThinkPHP无限级分类原理实现留言与回复功能实例
2014/10/31 PHP
Laravel的throttle中间件失效问题解决方法
2016/10/09 PHP
php 中奖概率算法实现代码
2017/01/25 PHP
laravel框架中控制器的创建和使用方法分析
2019/11/23 PHP
javascript 设计模式之单体模式 面向对象学习基础
2010/04/18 Javascript
基于jQuery的淡入淡出可自动切换的幻灯插件打包下载
2010/09/15 Javascript
jquery select多选框的左右移动 具体实现代码
2013/07/03 Javascript
php+js实现倒计时功能
2014/06/02 Javascript
在JS数组特定索引处指定位置插入元素的技巧
2014/08/24 Javascript
吐槽一下我所了解的Node.js
2014/10/08 Javascript
jquery实现无限分级横向导航菜单的方法
2015/03/12 Javascript
jQuery使用正则表达式限制文本框只能输入数字
2016/06/18 Javascript
微信小程序 Storage API实例详解
2016/10/02 Javascript
assert()函数用法总结(推荐)
2017/01/25 Javascript
原生JS实现移动端web轮播图详解(结合Tween算法造轮子)
2017/09/10 Javascript
通过jquery.cookie.js实现记住用户名、密码登录功能
2018/06/20 jQuery
vue引入微信sdk 实现分享朋友圈获取地理位置功能
2019/07/04 Javascript
jQuery高级编程之js对象、json与ajax用法实例分析
2019/11/01 jQuery
原生js实现碰撞检测
2020/03/12 Javascript
详解Webpack抽离第三方类库以及common解决方案
2020/03/30 Javascript
java直接调用python脚本的例子
2014/02/16 Python
详解Python中的Cookie模块使用
2015/07/06 Python
Python vtk读取并显示dicom文件示例
2020/01/13 Python
python实现全排列代码(回溯、深度优先搜索)
2020/02/26 Python
用Python生成HTML表格的方法示例
2020/03/06 Python
FORZIERI福喜利中国官网:奢侈品购物梦工厂
2019/05/03 全球购物
莫斯科隐形眼镜网上商店:Linzi
2019/07/22 全球购物
意大利奢侈品牌在线精品店:Jole.it
2020/11/23 全球购物
Java语言程序设计测试题判断题部分
2013/01/06 面试题
小学音乐教学反思
2014/02/05 职场文书
银行委托书范本
2014/09/28 职场文书
关于工作经历的证明书
2014/10/11 职场文书
服务整改报告
2014/11/06 职场文书
教师个人考察材料
2014/12/16 职场文书
幼儿教师师德培训心得体会
2016/01/09 职场文书
《英雄联盟》2022日蚀、月蚀皮肤演示 黑潮亚索曝光
2022/04/13 其他游戏