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 继承详解 第一篇
Aug 30 Javascript
原生Javascript封装的一个AJAX函数分享
Oct 11 Javascript
node.js中的http.response.addTrailers方法使用说明
Dec 14 Javascript
js获取会话框prompt的返回值的方法
Jan 10 Javascript
Jquery使用小技巧汇总
Dec 29 Javascript
Bootstrap文件上传组件之bootstrap fileinput
Nov 25 Javascript
微信小程序 122100版本更新问题解决方案
Dec 22 Javascript
Angularjs中的ui-bootstrap的使用教程
Feb 19 Javascript
JavaScript仿微信打飞机游戏
Jul 05 Javascript
关于jQuery.ajax()的jsonp碰上post详解
Jul 02 jQuery
layui表格 返回的数据状态异常的解决方法
Sep 10 Javascript
electron踩坑之remote of undefined的解决
Oct 06 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
php is_file 判断给定文件名是否为一个正常的文件
2010/05/10 PHP
排序算法之PHP版快速排序、冒泡排序
2014/04/09 PHP
PHP防止注入攻击实例分析
2014/11/03 PHP
使用php自动备份数据库表的实现方法
2017/07/28 PHP
js电信网通双线自动选择技巧
2008/11/18 Javascript
jQuery实现密保互斥问题解决方案
2013/08/16 Javascript
使用Nodejs开发微信公众号后台服务实例
2014/09/03 NodeJs
jquery插件unobtrusive实现片段式加载
2015/06/15 Javascript
nodejs爬虫抓取数据之编码问题
2015/07/03 NodeJs
JS组件系列之Bootstrap table表格组件神器【二、父子表和行列调序】
2016/05/10 Javascript
使用bootstrap3开发响应式网站
2016/05/12 Javascript
JQuery validate插件Remote用法大全
2016/05/15 Javascript
JavaScript和jQuery获取input框的绝对位置实现方法
2016/10/13 Javascript
Ajax异步文件上传与NodeJS express服务端处理
2017/04/01 NodeJs
Bootstrap下拉菜单更改为悬停(hover)触发的方法
2017/05/24 Javascript
javascript中UMD规范的代码推演
2018/08/29 Javascript
[01:16]2014DOTA2 TI专访C9战队EE:中国五强中会占三席
2014/07/10 DOTA
Python接口测试结果集实现封装比较
2020/05/01 Python
keras model.fit 解决validation_spilt=num 的问题
2020/06/19 Python
LTD Commodities:礼品,独特发现,家居装饰,家用器皿
2017/08/11 全球购物
欧洲领先的火车票和大巴票预订平台:Trainline
2018/12/26 全球购物
Brother加拿大官网:打印机、贴标机、缝纫机
2019/10/09 全球购物
瑞典香水、须后水和美容产品购物网站:Parfym-Klick.se
2019/12/29 全球购物
Linux管理员面试题 Linux admin interview questions
2014/11/01 面试题
促销活动策划方案
2014/01/12 职场文书
宾馆总经理岗位职责
2014/02/14 职场文书
烹饪自我鉴定
2014/03/01 职场文书
请假条范文大全
2014/04/10 职场文书
旅游节目策划方案
2014/05/26 职场文书
共产党员岗位承诺书
2014/05/29 职场文书
旅游与环境专业求职信
2014/06/05 职场文书
电子商务实训报告总结
2014/11/05 职场文书
邓小平文选读书笔记
2015/06/29 职场文书
孙振耀退休感言
2015/08/01 职场文书
浅析MongoDB之安全认证
2021/06/26 MongoDB
详解Nginx 被动检查服务器的存活状态
2021/10/16 Servers