JS特殊函数(Function()构造函数、函数直接量)区别介绍


Posted in Javascript onMay 19, 2013

函数定义
函数是由这样的方式进行声明的:关键字 function、函数名、一组参数,以及置于括号中的待执行代码。
函数的构造语法有这三种:
Js代码

1.function functionName(arg0, arg1, ... argN) { statements }//function语句 
2.var function_name = new Function(arg1, arg2, ..., argN, function_body);//Function()构造函数 
3.var func = function(arg0, arg1, ... argN) { statements };//函数直接量

示例:
Js代码
1.function f(x){return x*x};//function语句 
2.var f = new Function("x","return x*x;");//Function()构造函数 
3.var f = function(x){return x*x;};//函数直接量

如果函数无明确的返回值,或调用了没有参数的 return 语句,那么它真正返回的值是 undefined。

Function()构造函数
函数实际上是功能完整的对象 。Function类可以表示开发者定义的任何函数。用Function类直接创建函数的语法如下:
var function_name = new function(arg1, arg2, ..., argN, function_body)
在上面的形式中,每个 arg 都是一个参数,最后一个参数是函数主体(要执行的代码)。这些参数必须是字符串。
var sayHi = new Function("sName", "sMessage", "alert('Hello ' + sName + sMessage);");
sayHi("jzj,", "你好!");//Hello jzj,你好!
函数名只是指向函数的变量,那么可以把函数作为参数传递给另一个函数吗?答案是可以的,请看:
Js代码

function callAnotherFunc(fnFunction, vArgument) { 
fnFunction(vArgument); 
} 
var doAdd = new Function("iNum", "alert(iNum + 10)"); 
callAnotherFunc(doAdd, 10); //输出 "20"

注意:尽管可以使用 Function 构造函数创建函数,但最好不要使用它,因为用它定义函数比用传统方式要慢得多。不过,所有函数都应看作 Function 类的实例 。
如果你定义的函数没有参数,那么可以只需给构造函数传递一个字符串(即函数的主体)即可。
注意:传递给构造函数Function()的参数中没有一个用于说明它要创建的函数名。用Function()构造函数创建的未命名函数有时被称为“匿名函数”。
Function()函数允许我们动态地建立和编译一个函数,它不会将我们限制在function语句预编译的函数体中。
函数直接量
函数直接量是一个表达式,它可以定义匿名函数。函数直接量的语法和function语句非常相似,只不过它被用作表达式,而不是用作语句,而且也无需指定函数名。语法:
Js代码
var func = function(arg0, arg1, ... argN) { statements };//函数直接量

虽然函数直接量创建的是未命名函数,但是它的语法也规定它可以指定函数名,这在编写调用自身的递归函数时非常有用,例如:
Js代码
var f = function fact(x) { 
if (x <= 1) { 
return 1; 
} else { 
return x * fact(x - 1); 
} 
};

注:它并没有真正创建一个名为fact()函数,只是允许函数体用这个名字来引用自身。JavaScript1.5之前的版本中没有正确实现这种命名的函数直接量。
函数引用
函数名并没有什么实质意义,它不过是用来保存函数的变量名字,可以将这个函数赋给其他变量,它仍然会以相同方式起作用:
Js代码
function square(x){return x*x;} 
var a = square; 
var b = a(5);//b 为25

这有点像C++中的函数指针了。
Function()构造函数和函数直接量差别
Function()构造函数和函数直接量之间的差别有一点就是:使用构造函数Function()创建的函数不使用词法作用域,相反的,它们总是被顶级函数来编译,如:
Js代码
var y = "global"; 
function constructFunction() { 
var y = "local"; 
//Function()构造函数 
return new Function("return y;");//不使用局部作用域 
} 
function constFunction() { 
var y = "local"; 
//函数直接量 
var f = function () { 
return y;//使用局部作用域 
}; 
return f; 
} 
//显示 global,因为Function()构造函数返回的函数并不使用局部作用域 
alert(constructFunction()()); 
//显示 lobal,因为函数直接量返回的函数并使用局部作用域 
alert(constFunction()());
Javascript 相关文章推荐
JavaScript获得当前网页来源页面(即上一页)的方法
Apr 03 Javascript
全系IE支持Bootstrap的解决方法
Oct 19 Javascript
js实现滚动条滚动到某个位置便自动定位某个tr
Jan 20 Javascript
javascript简单实现跟随滚动条漂浮的返回顶部按钮效果
Aug 19 Javascript
原生JS查找元素的方法(推荐)
Nov 22 Javascript
vue loadmore组件上拉加载更多功能示例代码
Jul 19 Javascript
vue引入jq插件的实例讲解
Sep 12 Javascript
javascript实现循环广告条效果
Dec 12 Javascript
Angular2实现组件交互的方法分析
Dec 19 Javascript
Angular5中提取公共组件之radio list的实例代码
Jul 10 Javascript
Angular如何由模板生成DOM树的方法
Dec 23 Javascript
js构造函数constructor和原型prototype原理与用法实例分析
Mar 02 Javascript
JavaScript中几个重要的属性(this、constructor、prototype)介绍
May 19 #Javascript
js函数中onmousedown和onclick的区别和联系探讨
May 19 #Javascript
下拉菜单点击实现连接跳转功能的js代码
May 19 #Javascript
js操纵跨frame的三级联动select下拉选项实例介绍
May 19 #Javascript
固定背景实现的背景滚动特效示例分享
May 19 #Javascript
Jquery实现鼠标移上弹出提示框、移出消失思路及代码
May 19 #Javascript
扩展js对象数组的OrderByAsc和OrderByDesc方法实现思路
May 17 #Javascript
You might like
一首老MP3,致敬WAR3经典
2021/03/08 魔兽争霸
php 清除网页病毒的方法
2008/12/05 PHP
php简单读取.vcf格式文件的方法示例
2017/09/02 PHP
PHP封装mysqli基于面向对象的mysql数据库操作类与用法示例
2019/02/25 PHP
PHP pthreads v3在centos7平台下的安装与配置操作方法
2020/02/21 PHP
js跨域和ajax 跨域问题的实现思路
2009/09/05 Javascript
THREE.JS入门教程(4)创建粒子系统
2013/01/24 Javascript
JQuery分别取得每行最后一列和最后一行的示例代码
2013/08/18 Javascript
鼠标左键单击冲突的问题解决方法(防止冒泡)
2014/05/14 Javascript
什么是Node.js?Node.js详细介绍
2014/06/01 Javascript
nodejs实现的一个简单聊天室功能分享
2014/12/06 NodeJs
JS中的Replace方法使用经验分享
2015/05/20 Javascript
基于jQuery的Web上传插件Uploadify使用示例
2016/05/19 Javascript
高效Web开发的10个jQuery代码片段
2016/07/22 Javascript
利用Jquery队列实现根据输入数量显示的动画
2016/09/01 Javascript
vue项目中v-model父子组件通信的实现详解
2017/12/10 Javascript
node实现socket链接与GPRS进行通信的方法
2019/05/20 Javascript
Vue Object.defineProperty及ProxyVue实现双向数据绑定
2020/09/02 Javascript
详解JavaScript数据类型和判断方法
2020/09/04 Javascript
python检测服务器是否正常
2014/02/16 Python
Python中断言Assertion的一些改进方案
2016/10/27 Python
Python操作使用MySQL数据库的实例代码
2017/05/25 Python
python中正则表达式 re.findall 用法
2018/10/23 Python
Python正则表达式和元字符详解
2018/11/29 Python
详解Python网络框架Django和Scrapy安装指南
2019/04/01 Python
Python 日期区间处理 (本周本月上周上月...)
2019/08/08 Python
Python序列化pickle模块使用详解
2020/03/05 Python
小 200 行 Python 代码制作一个换脸程序
2020/05/12 Python
浅析NumPy 切片和索引
2020/09/02 Python
澳大利亚拥有最佳跳伞降落点和最好服务的跳伞项目运营商:Skydive Australia
2018/03/05 全球购物
路政管理专业推荐信
2013/11/11 职场文书
大学生最常用的自我评价
2013/12/07 职场文书
护理见习报告范文
2014/11/03 职场文书
2015年城管执法工作总结
2015/07/23 职场文书
MySQL命令无法输入中文问题的解决方式
2021/08/30 MySQL
Python实现自动玩连连看的脚本分享
2022/04/04 Python