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 05 Javascript
网页图片延时加载的js代码
Apr 22 Javascript
简介JavaScript中toTimeString()方法的使用
Jun 12 Javascript
js实现的tab标签切换效果代码分享
Aug 25 Javascript
javascript数组常用方法汇总
Sep 10 Javascript
js print打印网页指定区域内容的简单实例
Nov 01 Javascript
ZeroClipboard.js使用一个flash复制多个文本框
Jun 19 Javascript
JS鼠标滚动分页效果示例
Jul 05 Javascript
微信小程序获取手机系统信息的方法【附源码下载】
Dec 07 Javascript
JavaScript实现元素滚动条到达一定位置循环追加内容
Dec 28 Javascript
快速了解Vue父子组件传值以及父调子方法、子调父方法
Jul 15 Javascript
JavaScript动画实例之粒子文本的实现方法详解
Jul 28 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作为Shell脚本语言使用
2006/10/09 PHP
PHP笛卡尔积实现原理及代码实例
2020/12/09 PHP
js arguments.callee的应用代码
2009/05/07 Javascript
有道JavaScript监听浏览器的问题
2010/06/23 Javascript
javascript parseInt() 函数的进制转换注意细节
2013/01/08 Javascript
javascript中parentNode,childNodes,children的应用详解
2013/12/17 Javascript
将HTML的左右尖括号等转义成实体形式的两种实现方式
2014/05/04 Javascript
jquery处理页面弹出层查询数据等待操作实例
2015/03/25 Javascript
BOM系列第一篇之定时器setTimeout和setInterval
2016/08/17 Javascript
轻松理解JavaScript之AJAX
2017/03/15 Javascript
JS全角与半角转化实例(分享)
2017/07/04 Javascript
javascript字体颜色控件的开发 JS实现字体控制
2017/11/27 Javascript
koa2 用户注册、登录校验与加盐加密的实现方法
2019/07/22 Javascript
layui 地区三级联动 form select 渲染的实例
2019/09/27 Javascript
解决$store.getters调用不执行的问题
2019/11/08 Javascript
JavaScript对象原型链原理解析
2020/01/22 Javascript
使用 Opentype.js 生成字体子集的实例代码详解
2020/05/25 Javascript
vue离开当前页面触发的函数代码
2020/09/01 Javascript
[01:43]3.19DOTA2发布会 三代刀塔人第三代
2014/03/25 DOTA
python获取mp3文件信息的方法
2015/06/15 Python
Flask模拟实现CSRF攻击的方法
2018/07/24 Python
总结python中pass的作用
2019/02/27 Python
详解pandas数据合并与重塑(pd.concat篇)
2019/07/09 Python
python中p-value的实现方式
2019/12/16 Python
pandas 按日期范围筛选数据的实现
2021/02/20 Python
C/C++程序员常见面试题一
2012/12/08 面试题
生物科学专业个人求职信范文
2013/12/07 职场文书
元旦获奖感言
2014/03/08 职场文书
明星员工获奖感言
2014/08/14 职场文书
2014年设备管理工作总结
2014/11/26 职场文书
2014年扶贫帮困工作总结
2014/12/09 职场文书
2015年派出所民警工作总结
2015/04/24 职场文书
文艺委员竞选稿
2015/11/19 职场文书
pandas中DataFrame重置索引的几种方法
2021/05/24 Python
nginx结合openssl实现https的方法
2021/07/25 Servers
解决pycharm下载库时出现Failed to install package的问题
2021/09/04 Python