比较常见的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 相关文章推荐
jQuery动态添加的元素绑定事件处理函数代码
Aug 02 Javascript
jQuery中jqGrid分页实现代码
Nov 04 Javascript
JS正则表达式获取分组内容的方法详解
Nov 15 Javascript
浅析js预加载/延迟加载
Sep 25 Javascript
html的DOM中Event对象onabort事件用法实例
Jan 21 Javascript
Javascript中3个需要注意的运算符
Apr 02 Javascript
如何用js实现鼠标向上滚动时浮动导航
Jul 18 Javascript
深入理解Node.js中的进程管理
Mar 13 Javascript
node+koa实现数据mock接口的方法
Sep 20 Javascript
layui 实现表单和文件上传一起传到后台的例子
Sep 16 Javascript
vue分页插件的使用方法
Dec 25 Javascript
jQuery实现日历效果
Sep 11 jQuery
详解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整合百度Ueditor图文教程
2014/10/21 PHP
PHP读取txt文本文件并分页显示的方法
2015/03/11 PHP
浅谈PHP中类和对象的相关函数
2017/04/26 PHP
PHP读取CSV大文件导入数据库的实例
2017/07/24 PHP
php之可变变量的实例详解
2017/09/12 PHP
Laravel框架生命周期与原理分析
2018/06/12 PHP
php微信开发之图片回复功能
2018/06/14 PHP
PHP 实现文件压缩解压操作的方法
2019/06/14 PHP
PHP设计模式之适配器模式(Adapter)原理与用法详解
2019/12/12 PHP
一个可以兼容IE FF的加为首页与加入收藏实现代码
2009/11/02 Javascript
使用JS获取当前地理位置方法汇总
2014/12/18 Javascript
JavaScript中number转换成string介绍
2014/12/31 Javascript
JavaScript SweetAlert插件实现超酷消息警告框
2016/01/28 Javascript
JS实现旋转木马式图片轮播效果
2017/01/18 Javascript
JavaScript中的子窗口与父窗口的互相调用问题
2017/02/08 Javascript
vue中如何实现变量和字符串拼接
2017/06/19 Javascript
javascript 日期相减-在线教程(附代码)
2017/08/17 Javascript
使用clipboard.js实现复制功能的示例代码
2017/10/16 Javascript
Vue作用域插槽slot-scope实例代码
2018/09/05 Javascript
Vue2.0学习系列之项目上线的方法步骤(图文)
2018/09/25 Javascript
浅析Vue中拆分视图层代码的5点建议
2019/08/15 Javascript
[47:20]DAC2018 4.4 淘汰赛 Optic vs Mineski 第一场
2018/04/05 DOTA
python解决字典中的值是列表问题的方法
2013/03/04 Python
python实现扫描局域网指定网段ip的方法
2019/04/16 Python
python控制nao机器人身体动作实例详解
2019/04/29 Python
Python替换月份为英文缩写的实现方法
2019/07/15 Python
Python使用tkinter实现摇骰子小游戏功能的代码
2020/07/02 Python
详解Python GUI编程之PyQt5入门到实战
2020/12/10 Python
SHEIN台湾:购买最新流行女装服饰
2019/05/18 全球购物
迟到检讨书900字
2014/01/14 职场文书
奥巴马的演讲稿
2014/05/15 职场文书
入党介绍人意见范文
2015/06/01 职场文书
大学组织委员竞选稿
2015/11/21 职场文书
在Windows下安装配置CPU版的PyTorch的方法
2021/04/02 Python
浅谈移动端中的视口(viewport)的具体使用
2021/04/13 HTML / CSS
只用40行Python代码就能写出pdf转word小工具
2021/05/31 Python