javascript函数定义的几种区别小结


Posted in Javascript onJanuary 06, 2014

javascript函数的定义

1:调用关键字function来构造,如:
function distance(x1,x2,y1,y2)
{
var dx=x2-x1;
var dy=y2-y1;
return Math.sqrt(dx*dx+dy*dy);
}

2:使用Function()构造函数
var f=new Function*"x","y","return x*y");
这行代码创建了一个新函数,该函数和你所熟悉的语法定义的函数基本上时等价的:

function f(x,y)
{
return x*y;
}

Functino()构造函数可以接受任意多个字符串参数。它的最后一个参数时函数的主体,其中可以包含任何JavaScript语句,语句之间用分号分隔。其他的参数都是用来说明函数要定义的形式参数名的字符串。如果你定义的函数没有参数,那么可以只需给构造函数传递一个字符串(即函数的主体)即可。

注意,传递给构造函数Function()的参数中没有一个用于说明它要创建的函数名。用Function()构造函数创建的未命名函数有时被成为“匿名函数”。

你可能非常想知道Function()构造函数的用途是什么。为什么不能只用function语句来定义所有的函数呢?原因是Function()构造函数允许我们动态地建立和编译一个函数,它不会将我们限制在function语句预编译的函数体中。这样做带来的负面影响效应就是每次调用一个函数时,Function()构造函数都要对它进行编译。因此,在循环体中或者在经常使用的函数中,我们不应该频繁地调用这个构造函数。

使用Function()构造函数的另一个原因是它能够将函数定义为JavaScript表达式的一部分,而不是将其定义一个语句,这种情况下使用它就显得比较的方面,甚至可以说精致。

3:函数直接量
函数直接量是一个表达式,它可以定义匿名函数。函数直接量的语法和function语句非常相似,只不过它被用作表达式,而不是用作语句,而且也无需指定函数名。下面的三行代码分别使用function()语句、Funciont()构造函数和函数直接量定义了三个基本上相同的函数:

function f(x){return x*x};
var f=new Function("x","return x*x;");
var f=function(x){reurn x*x};

虽然函数直接量创建的是未命名函数,但是它的语法也规定它可以指定函数名,这在编写调用自身的递归函数时非常有用。例如:
var f=function fact(x){if(x<=1)return 1;else return x*fact(x-1);};
上面的代码定义了一个未命名函数,并对它的引用存储在变量f中。它并没有真正的创建一个名为fact()的函数,只是允许函数体用这个名字来引用自身。但是要注意,JavaScript1.5之前的版本中没有正确实现这种命名的函数直接量。

函数直接量的用法和用Function()构造函数创建函数的方法非常相似。由于它们都是由JavaScript的表达式创建的,而不是由语句创建的,所以使用它们的方式也就更加灵活,尤其适用于那些只使用一次,而且无需命名的函数。例如,一个使用函数直接量表达式指定的函数可以存储在一个变量中、传递给其他的函数甚至被直接调用:

a[0]=function(x){return x*x;};//定义一个函数并保存它
a.sort(function(a,b){return a-b;});//定义一个函数;把它传递给另一个函数
var tensquared=(function(x){return x*x;})(10);

和Function()构造函数一样,函数直接量创建的是未命名函数,而且不会自动地将这个函数存储在属性中。但是,比起Function()构造函数来说,函数直接量有一个重要的优点。由Function()构造函数创建的函数的主体必须用一个字符串说明,用这种方式来表达一个长而复杂的函数是狠笨拙的。但是函数直接量的主体使用的却是标准的JavaScript语法。而且函数直接量只被解析一次,而作为字符串传递给Function()构造函数的 JavaScript代码则在每次调用构造函数时只需被解析一次和编译一次。

在JavaScript1.1中,可以使用构造函数Function()来定义函数,在JavaScript1.2和其后的版本中,还可以使用函数直接量来构造函数。你应该注意这两种方法之间的重要差别。

首先,构造函数Function()允许在运行时动态地创建和编译JavaScript代码。但是函数直接量却是函数结构的一个静态部分,就像function语句一样。

其次,作为第一个差别的必然结果,每次调用构造函数Function()时都会解析函数体并且创建一个新东汉数对象。如果对构造函数的调用出现在一个循环中,或者出现在一个经常被调用的函数中,这种方法的效率非常低。另一个方面,函数直接量或出现在循环和函数中的嵌套函数不是在每次调用时都被重新编译,而且每当遇到一个函数直接量时也不创建一个新的函数对象。

Function()构造函数和函数之间量之间的第三点差别是,使用构造函数Function()创建的函数不使用词法作用域,相反的,它们总是被当作顶级函数来编译,就像下面代码所说明的那样:

var y="global";
function constructFunction()
{
var y="local";
return new Function("return y");//不捕捉局部作用域。
}
//这行代码将显示"global",因为Function()构造函数返回的函数并不使用局部作用域。
//假如使用一个函数直接量,这行代码则可能显示"local"。
alert(constructFunction());

Javascript 相关文章推荐
html数组字符串拼接的最快方法
Sep 16 Javascript
js 鼠标移动显示图片的简单实例
Dec 25 Javascript
Javascript 遍历页面text控件详解
Jan 06 Javascript
深入理解JavaScript系列(37):设计模式之享元模式详解
Mar 04 Javascript
javascript和jQuery实现网页实时聊天的ajax长轮询
Jul 20 Javascript
jQuery组件easyui基本布局实现代码
Aug 25 Javascript
JavaScript将base64图片转换成formData并通过AJAX提交的实现方法
Oct 24 Javascript
react-native 完整实现登录功能的示例代码
Sep 11 Javascript
Bootstrap Fileinput 4.4.7文件上传实例详解
Jul 25 Javascript
利用Bootstrap Multiselect实现下拉框多选功能
Apr 08 Javascript
javascript异步处理与Jquery deferred对象用法总结
Jun 04 jQuery
通过实例解析vuejs如何实现调试代码
Jul 16 Javascript
javascript 用函数语句和表达式定义函数的区别详解
Jan 06 #Javascript
js形成页面的一种遮罩效果实例代码
Jan 04 #Javascript
JavaScript将数据转换成整数的方法
Jan 04 #Javascript
jquery.post用法关于type设置问题补充
Jan 03 #Javascript
JQuery处理json与ajax返回JSON实例代码
Jan 03 #Javascript
jquery.post用法示例代码
Jan 03 #Javascript
简单的代码实现jquery定时器
Jan 03 #Javascript
You might like
Zend framework处理一个http请求的流程分析
2010/02/08 PHP
PHP动态输出JavaScript代码实例
2015/02/12 PHP
PHP数组遍历的几种常见方式总结
2019/02/15 PHP
VSCode+PHPstudy配置PHP开发环境的步骤详解
2020/08/20 PHP
动手学习无线电
2021/03/10 无线电
javascript appendChild,innerHTML,join性能比较代码
2009/08/29 Javascript
js弹出层之1:JQuery.Boxy (二)
2011/10/06 Javascript
JavaScript中读取和保存文件实例
2014/05/08 Javascript
基于 Docker 开发 NodeJS 应用
2014/07/30 NodeJs
浅谈jquery设置和获得checkbox选中的问题
2016/08/19 Javascript
JS实现选定指定HTML元素对象中指定文本内容功能示例
2017/02/13 Javascript
Angular2入门--架构总览
2017/03/29 Javascript
JavaScript实现打地鼠小游戏
2020/04/23 Javascript
详解Angular 中 ngOnInit 和 constructor 使用场景
2017/06/22 Javascript
Angular 4中如何显示内容的CSS样式示例代码
2017/11/06 Javascript
vue中实现左右联动的效果
2018/06/22 Javascript
又拍云 Node.js 实现文件上传、删除功能
2018/10/28 Javascript
JS动画实现回调地狱promise的实例代码详解
2018/11/08 Javascript
在Vant的基础上封装下拉日期控件的代码示例
2018/12/05 Javascript
js 闭包深入理解与实例分析
2020/03/19 Javascript
[01:51]2014DOTA2西雅图邀请赛 MVP 外卡赛black场间采访
2014/07/09 DOTA
Python新手在作用域方面经常容易碰到的问题
2015/04/03 Python
pandas 实现字典转换成DataFrame的方法
2018/07/04 Python
python同时遍历数组的索引和值的实例
2018/11/15 Python
python paramiko利用sftp上传目录到远程的实例
2019/01/03 Python
python 机器学习之支持向量机非线性回归SVR模型
2019/06/26 Python
python监控进程状态,记录重启时间及进程号的实例
2019/07/15 Python
python——全排列数的生成方式
2020/02/26 Python
Pytorch数据拼接与拆分操作实现图解
2020/04/30 Python
python随机模块random的22种函数(小结)
2020/05/15 Python
CSS3实现酷炫的3D旋转透视效果
2019/11/21 HTML / CSS
Shoes For Crews法国官网:美国领先的防滑鞋设计和制造商
2018/01/01 全球购物
Infababy英国:婴儿推车、Travel System婴儿车和婴儿汽车座椅销售
2018/05/23 全球购物
英国买鞋网站:Charles Clinkard
2019/11/14 全球购物
市场营销专业个人自荐信格式
2013/09/21 职场文书
大学生求职意向书
2015/05/11 职场文书