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 相关文章推荐
javascript类继承机制的原理分析
Sep 12 Javascript
JavaScript 操作键盘的Enter事件(键盘任何事件),兼容多浏览器
Oct 11 Javascript
简介JavaScript中substring()方法的使用
Jun 06 Javascript
JavaScript判断图片是否已经加载完毕的方法汇总
Feb 05 Javascript
浅谈Angular.js中使用$watch监听模型变化
Jan 10 Javascript
HTML5+jQuery实现搜索智能匹配功能
Mar 24 jQuery
angular-ngSanitize模块-$sanitize服务详解
Jun 13 Javascript
你有必要知道的10个JavaScript难点
Jul 25 Javascript
利用JavaScript实现栈的数据结构示例代码
Aug 02 Javascript
浅谈Angular2 模块懒加载的方法
Oct 04 Javascript
详解自定义ajax支持跨域组件封装
Feb 08 Javascript
纯js+css实现在线时钟
Aug 18 Javascript
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
PHP中Date获取时间不正确怎么办
2008/06/05 PHP
php 向访客和爬虫显示不同的内容
2009/11/09 PHP
基于递归实现的php树形菜单代码
2014/11/19 PHP
php curl请求信息和返回信息设置代码实例
2015/04/27 PHP
降低PHP Redis内存占用
2017/03/23 PHP
Windows 下安装 swoole 图文教程(php)
2017/06/05 PHP
laravel 实现设置时区的简单方法
2019/10/10 PHP
JQUERY 对象与DOM对象之两者相互间的转换
2009/04/27 Javascript
javascript的渐进增强与平稳退化浅谈
2013/11/12 Javascript
javascript右下角弹层及自动隐藏(自己编写)
2013/11/20 Javascript
jquery获得keycode的示例代码
2013/12/30 Javascript
编写简单的jQuery提示插件
2014/12/21 Javascript
javascript实现左右控制无缝滚动
2014/12/31 Javascript
基于jquery实现简单的分页控件
2016/03/17 Javascript
原生javascript实现的一个简单动画效果
2016/03/30 Javascript
jQuery实现在HTML文档加载完毕后自动执行某个事件的方法
2017/05/08 jQuery
基于JavaScript表单脚本(详解)
2017/10/18 Javascript
微信小程序scroll-view实现字幕滚动
2018/07/14 Javascript
vue实现简单的星级评分组件源码
2018/11/16 Javascript
echarts实现折线图的拖拽效果
2019/12/19 Javascript
Django URL传递参数的方法总结
2016/08/28 Python
详解Django中类视图使用装饰器的方式
2018/08/12 Python
Python后台开发Django会话控制的实现
2019/04/15 Python
selenium获取当前页面的url、源码、title的方法
2019/06/12 Python
numpy中的meshgrid函数的使用
2019/07/31 Python
对Python中 \r, \n, \r\n的彻底理解
2020/03/06 Python
浅谈keras中的目标函数和优化函数MSE用法
2020/06/10 Python
浅谈Python中的继承
2020/06/19 Python
python爬虫beautifulsoup库使用操作教程全解(python爬虫基础入门)
2021/02/19 Python
Html5定位终极解决方案
2020/02/05 HTML / CSS
如何在Oracle中查看各个表、表空间占用空间的大小
2015/10/31 面试题
党委书记个人检查对照材料思想汇报
2014/10/11 职场文书
因个人原因离职的辞职信范文
2015/05/12 职场文书
婚育证明格式
2015/06/17 职场文书
Java Kafka 消费积压监控的示例代码
2021/07/01 Java/Android
苹果可能正在打击不进行更新的 App
2022/04/24 数码科技