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的Cookies
Jan 16 Javascript
ext监听事件方法[初级篇]
Apr 27 Javascript
jquery ajax修改全局变量示例代码
Nov 08 Javascript
javascript实现通过表格绘制颜色填充矩形的方法
Apr 21 Javascript
jQuery使用$.ajax进行异步刷新的方法(附demo下载)
Dec 04 Javascript
三个js循环的关键字示例(for与while)
Feb 16 Javascript
js实现获取两个日期之间所有日期的方法
Jun 17 Javascript
BootStrapTable 单选及取值的实现方法
Jan 10 Javascript
微信小程序左滑删除效果的实现代码
Feb 20 Javascript
详解用webpack的CommonsChunkPlugin提取公共代码的3种方式
Nov 09 Javascript
如何使用Node.js爬取任意网页资源并输出PDF文件到本地
Jun 17 Javascript
浅谈Vue使用Cascader级联选择器数据回显中的坑
Oct 31 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 MySQL与分页效率
2008/06/04 PHP
网页游戏开发入门教程三(简单程序应用)
2009/11/02 PHP
PHP mcrypt可逆加密算法分析
2011/07/19 PHP
摘自织梦CMS中的图片处理类
2015/08/08 PHP
PHP数据分析引擎计算余弦相似度算法示例
2017/08/08 PHP
PHP开发实现快递查询功能详解
2019/04/08 PHP
在TP5数据库中四个字段实现无限分类的示例
2019/10/18 PHP
laravel框架语言包拓展实现方法分析
2019/11/22 PHP
一个基于jquery的文本框记数器
2012/09/19 Javascript
js仿百度有啊通栏展示效果实现代码
2013/05/28 Javascript
JQuery.Ajax之错误调试帮助信息介绍
2013/07/04 Javascript
node.js中的fs.readdir方法使用说明
2014/12/17 Javascript
js实现背景图片感应鼠标变化的方法
2015/02/28 Javascript
js实现下拉列表选中某个值的方法(3种方法)
2015/12/17 Javascript
创建echart多个联动的示例代码
2018/11/23 Javascript
微信小程序实现的图片保存功能示例
2019/04/24 Javascript
一篇文章带你浅入webpack的DLL优化打包
2020/02/20 Javascript
[02:31]2014DOTA2国际邀请赛2009专访:干爹表现出乎意料 看好DK杀回决赛
2014/07/20 DOTA
python实现网页链接提取的方法分享
2014/02/25 Python
Python3实现连接SQLite数据库的方法
2014/08/23 Python
python的即时标记项目练习笔记
2014/09/18 Python
用Python登录Gmail并发送Gmail邮件的教程
2015/04/17 Python
编写Python小程序来统计测试脚本的关键字
2016/03/12 Python
python实现txt文件格式转换为arff格式
2018/05/31 Python
Python生成器generator用法示例
2018/08/10 Python
基于python实现KNN分类算法
2020/04/23 Python
Python实现html转换为pdf报告(生成pdf报告)功能示例
2019/05/04 Python
Python计算一个点到所有点的欧式距离实现方法
2019/07/04 Python
Python sql注入 过滤字符串的非法字符实例
2020/04/03 Python
纯css3无js实现的Android Logo(有简单动画)
2013/01/21 HTML / CSS
html+css3实现的登录界面
2020/12/09 HTML / CSS
2014教师个人自我评价范文
2014/09/13 职场文书
超市仓管员岗位职责范本
2014/09/18 职场文书
2015年元旦主持词开场白
2014/12/14 职场文书
八年级作文之感恩
2019/11/22 职场文书
基于Redis位图实现用户签到功能
2021/05/08 Redis