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 相关文章推荐
用js怎么把&amp;字符换成&quot;&amp;amp:&quot;
Oct 19 Javascript
导航跟随滚动条置顶移动示例代码
Sep 11 Javascript
jquery实现的树形目录实例
Jun 26 Javascript
JavaScript动态插入CSS的方法
Dec 10 Javascript
第三章之Bootstrap 表格与按钮功能
Apr 25 Javascript
JavaScript中apply方法的应用技巧小结
Sep 29 Javascript
node.js 和HTML5开发本地桌面应用程序
Dec 13 Javascript
微信小程序 slider 详解及实例代码
Jan 10 Javascript
Bootstrap选项卡学习笔记分享
Feb 13 Javascript
JavaScript标准对象_动力节点Java学院整理
Jun 27 Javascript
MUI实现上拉加载和下拉刷新效果
Jun 30 Javascript
Postman动态获取返回值过程详解
Jun 30 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常量的详解
2013/06/09 PHP
Smarty局部缓存的几种方法简介
2014/06/17 PHP
实例介绍PHP的Reflection反射机制
2014/08/05 PHP
php将print_r处理后的数据还原为原始数组的解决方法
2016/11/02 PHP
用js实现的抽象CSS圆角效果!!
2007/05/03 Javascript
Javascript 获取链接(url)参数的方法
2009/02/15 Javascript
基于jQuery的简单的列表导航菜单
2011/03/02 Javascript
Javascript Boolean、Nnumber、String 强制类型转换的区别详细介绍
2012/12/13 Javascript
node.js中的http.response.addTrailers方法使用说明
2014/12/14 Javascript
原生js制作简单的数字键盘
2015/04/24 Javascript
代码分析jQuery四种静态方法使用
2015/07/23 Javascript
原生js配合cookie制作保存路径的拖拽
2015/12/29 Javascript
JQuery ztree带筛选、异步加载实例讲解
2016/02/25 Javascript
JQuery validate 验证一个单独的表单元素实例
2017/02/17 Javascript
Vue中android4.4不兼容问题的解决方法
2018/09/04 Javascript
vue组件间通信六种方式(总结篇)
2019/05/15 Javascript
js HTML DOM EventListener功能与用法实例分析
2020/04/27 Javascript
原生JS实现拖拽效果
2020/12/04 Javascript
JavaScript 防盗链的原理以及破解方法
2020/12/29 Javascript
[14:36]2014 DOTA2国际邀请赛中国区预选赛5.21 Orenda VS NE
2014/05/22 DOTA
Python使用sklearn库实现的各种分类算法简单应用小结
2019/07/04 Python
python Tcp协议发送和接收信息的例子
2019/07/22 Python
pytorch 自定义卷积核进行卷积操作方式
2019/12/30 Python
pytorch torchvision.ImageFolder的用法介绍
2020/02/20 Python
DRF使用simple JWT身份验证的实现
2021/01/14 Python
css3高级选择器使用方法
2013/12/02 HTML / CSS
纯CSS改变webkit内核浏览器的滚动条样式
2014/04/17 HTML / CSS
微软英国官方网站:Microsoft英国
2016/10/15 全球购物
英国时尚服饰电商:Boohoo
2017/10/12 全球购物
C语言笔试题回忆
2015/04/02 面试题
软件测试工程师结构化面试题库
2016/11/23 面试题
试用期转正鉴定评语
2014/01/27 职场文书
学校学雷锋活动总结
2014/06/26 职场文书
社区端午节活动总结
2015/02/11 职场文书
2016年大学校运会广播稿件
2015/12/21 职场文书
详解CSS中postion和opacity及cursor的特性
2022/08/14 HTML / CSS