比较常见的javascript中定义函数的区别


Posted in Javascript onNovember 09, 2015

比较常见的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 相关文章推荐
跨浏览器通用、可重用的选项卡tab切换js代码
Sep 20 Javascript
jquery html动态生成select标签出问题的解决方法
Nov 20 Javascript
JS中判断null、undefined与NaN的方法
Mar 26 Javascript
简介JavaScript中Math.LOG10E属性的使用
Jun 14 Javascript
javascript中字体浮动效果的简单实例演示
Nov 18 Javascript
AngularJS中指令的四种基本形式实例分析
Nov 22 Javascript
微信小程序学习(4)-系统配置app.json详解
Jan 12 Javascript
微信小程序 密码输入(源码下载)
Jun 27 Javascript
Vue常用指令详解分析
Aug 19 Javascript
JQuery属性操作与循环用法示例
May 15 jQuery
vue实现element表格里表头信息提示功能(推荐)
Nov 20 Javascript
JavaScript实现商品评价五星好评
Nov 30 Javascript
详解JavaScript中的Unescape()和String() 函数
Nov 09 #Javascript
表单验证正则表达式实例代码详解
Nov 09 #Javascript
JS实现网页上随机产生超链接地址的方法
Nov 09 #Javascript
JavaScript获取页面中超链接数量的方法
Nov 09 #Javascript
window.location.hash知识汇总
Nov 09 #Javascript
JavaScript实现简单获取当前网页网址的方法
Nov 09 #Javascript
JavaScript识别网页关键字并进行描红的方法
Nov 09 #Javascript
You might like
ThinkPHP控制器间实现相互调用的方法
2014/10/31 PHP
前端必学之PHP语法基础
2016/01/01 PHP
php实现图片缩略图的方法
2016/03/29 PHP
Laravel Eloquent分表方法并使用模型关联的实现
2019/11/25 PHP
在IE,Firefox,Safari,Chrome,Opera浏览器上调试javascript
2008/12/02 Javascript
JavaScript的变量作用域深入理解
2009/10/25 Javascript
JQuery Dialog(JS 模态窗口,可拖拽的DIV)
2010/02/07 Javascript
JS高级调试技巧:捕获和分析 JavaScript Error详解
2014/03/16 Javascript
jQuery实现垂直半透明手风琴特效代码分享
2015/08/21 Javascript
jQuery选择器基础入门教程
2016/05/10 Javascript
vue-cli+webpack在生成的项目中使用bootstrap实例代码
2017/05/26 Javascript
微信小程序methods中定义的方法互相调用的实例代码
2018/08/07 Javascript
详解vue移动端项目的适配(以mint-ui为例)
2018/08/17 Javascript
Vux+Axios拦截器增加loading的问题及实现方法
2018/11/08 Javascript
JavaScript 引用类型实例详解【数组、对象、严格模式等】
2020/05/13 Javascript
何时/使用 Vue3 render 函数的教程详解
2020/07/25 Javascript
[01:01:52]DOTA2-DPC中国联赛定级赛 SAG vs iG BO3第二场 1月9日
2021/03/11 DOTA
[04:15]DOTA2-DPC中国联赛 正赛 Ehome vs Aster 选手采访
2021/03/11 DOTA
Python实现打印螺旋矩阵功能的方法
2017/11/21 Python
python脚本监控Tomcat服务器的方法
2018/07/06 Python
查看Python依赖包及其版本号信息的方法
2019/08/13 Python
pytorch索引查找 index_select的例子
2019/08/18 Python
python 计算方位角实例(根据两点的坐标计算)
2020/01/17 Python
如何快速一次性卸载所有python包(第三方库)呢
2020/10/20 Python
匡威德国官网:Converse德国
2019/01/26 全球购物
女孩每月服装订阅盒:kidpik
2019/04/17 全球购物
美国折扣地毯销售网站:Rugs.com
2020/03/27 全球购物
资产经营总监岗位职责
2013/12/04 职场文书
中药专业毕业自荐书范文
2014/02/08 职场文书
超市重阳节活动方案
2014/02/10 职场文书
代办委托书怎么写
2014/08/01 职场文书
以幸福为主题的活动方案
2014/08/22 职场文书
2014年打非治违工作总结
2014/11/13 职场文书
女儿满月酒致辞
2015/07/29 职场文书
golang 实现Location跳转方式
2021/05/02 Golang
JS的深浅复制详细
2021/10/16 Javascript