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 内置对象属性及方法集合
Jul 04 Javascript
javascript-表格排序(降序/反序)实现介绍(附图)
May 30 Javascript
jQuery多项选项卡的实现思路附样式及代码
Jun 03 Javascript
EasyUI创建对话框的两种方式
Aug 23 Javascript
Node.js websocket使用socket.io库实现实时聊天室
Feb 20 Javascript
详解vue-cli快速构建项目以及引入bootstrap、jq
May 26 Javascript
vue 插值 v-once,v-text, v-html详解
Jan 19 Javascript
浅谈MUI框架中加载外部网页或服务器数据的方法
Jan 31 Javascript
select标签设置默认选中的选项方法
Mar 02 Javascript
微信小程序使用二次贝塞尔曲线画波浪
Dec 25 Javascript
详解mpvue中小程序自定义导航组件开发指南
Feb 11 Javascript
微信小程序图片右边加两行文字的代码
Apr 23 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中查询SQL Server或Sybase时TEXT字段被截断的解决方法
2009/03/10 PHP
PHP 一个比较完善的简单文件上传
2010/03/25 PHP
PHP表单递交控件名称含有点号(.)会被转化为下划线(_)的处理方法
2013/01/06 PHP
php加水印的代码(支持半透明透明打水印,支持png透明背景)
2013/01/17 PHP
ThinkPHP 3.2 版本升级了哪些内容
2015/03/05 PHP
php根据生日计算年龄的方法
2015/07/13 PHP
PHP中的多种加密技术及代码示例解析
2016/10/20 PHP
使用XHProf查找PHP性能瓶颈的实例
2017/12/13 PHP
PHP中通过getopt解析GNU C风格命令行选项
2019/11/18 PHP
jquery ajax提交表单数据的两种实现方法
2010/04/29 Javascript
Javascript闭包用法实例分析
2015/01/23 Javascript
javascript自定义右键弹出菜单实现方法
2015/05/25 Javascript
angular2使用简单介绍
2016/03/01 Javascript
JS中setTimeout的巧妙用法前端函数节流
2016/03/24 Javascript
纯JS实现表单验证实例
2016/12/24 Javascript
bootstrap paginator分页前后台用法示例
2017/06/17 Javascript
javascript基础进阶_深入剖析执行环境及作用域链
2017/09/05 Javascript
vue中如何实现后台管理系统的权限控制的方法步骤
2019/09/05 Javascript
vue+vant使用图片预览功能ImagePreview的问题解决
2020/04/10 Javascript
微信小程序学习总结(五)常见问题实例小结
2020/06/04 Javascript
微信小程序实现弹幕墙(祝福墙)
2020/11/18 Javascript
简单的python协同过滤程序实例代码
2018/01/31 Python
pip安装时ReadTimeoutError的解决方法
2018/06/12 Python
python GUI库图形界面开发之PyQt5滚动条控件QScrollBar详细使用方法与实例
2020/03/06 Python
Python使用socket模块实现简单tcp通信
2020/08/18 Python
彻底解决pip下载pytorch慢的问题方法
2021/03/01 Python
html5手机键盘弹出收起的处理
2020/01/20 HTML / CSS
大学应届毕业生个人求职信
2013/09/23 职场文书
顶岗实习接收函
2014/01/09 职场文书
列车长先进事迹材料
2014/01/25 职场文书
大学迎新晚会主持词
2014/03/24 职场文书
2014年办公室个人工作总结
2014/11/12 职场文书
离婚上诉状范文
2015/05/23 职场文书
地道战观后感
2015/06/04 职场文书
最美乡村教师观后感
2015/06/11 职场文书
2016年学生会感恩节活动总结
2016/04/01 职场文书