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 相关文章推荐
不同浏览器的怪癖小结
Jul 11 Javascript
jquery实现居中弹出层代码
Aug 25 Javascript
js实现数组转换成json
Jun 26 Javascript
Javascript控制div属性动态变化实例分析
Oct 08 Javascript
Node.js包管理器Yarn的入门介绍与安装
Oct 17 Javascript
js实现上传图片预览方法
Oct 25 Javascript
AngularJS中的DOM操作用法分析
Nov 04 Javascript
angularjs实现上拉加载和下拉刷新数据功能
Jun 12 Javascript
vuex如何重置所有state(可定制)
Jan 17 Javascript
Vue中的组件及路由使用实例代码详解
May 22 Javascript
ES6函数实现排它两种写法解析
May 13 Javascript
解决VUE mounted 钩子函数执行时 img 未加载导致页面布局的问题
Jul 27 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中用正则表达式清除字符串的空白
2011/01/17 PHP
php写入数据到CSV文件的方法
2015/03/14 PHP
thinkphp框架下实现登录、注册、找回密码功能
2016/04/06 PHP
PHP递归获取目录内所有文件的实现方法
2016/11/01 PHP
再谈ie和firefox下的document.all属性
2009/10/21 Javascript
url 特殊字符 传递参数解决方法
2010/01/01 Javascript
extJs 下拉框联动实现代码
2010/04/09 Javascript
什么是json和jsonp,jQuery json实例详详细说明
2012/12/11 Javascript
jQuery+canvas实现的球体平抛及颜色动态变换效果
2016/01/28 Javascript
webstorm添加*.vue文件支持
2018/05/08 Javascript
Vue组件通信$attrs、$listeners实现原理解析
2020/09/03 Javascript
使用webpack5从0到1搭建一个react项目的实现步骤
2020/12/16 Javascript
Java 生成随机字符的示例代码
2021/01/13 Javascript
flask + pymysql操作Mysql数据库的实例
2017/11/13 Python
对python判断是否回文数的实例详解
2019/02/08 Python
python设置环境变量的原因和方法
2019/06/24 Python
python实现最大子序和(分治+动态规划)
2019/07/05 Python
Python获取命令实时输出-原样彩色输出并返回输出结果的示例
2019/07/11 Python
python3 enum模块的应用实例详解
2019/08/12 Python
python scipy卷积运算的实现方法
2019/09/16 Python
python RC4加密操作示例【测试可用】
2019/09/26 Python
500行代码使用python写个微信小游戏飞机大战游戏
2019/10/16 Python
Python如何将图像音视频等资源文件隐藏在代码中(小技巧)
2020/02/16 Python
jupyter notebook快速入门及使用详解
2020/11/13 Python
Pycharm中使用git进行合作开发的教程详解
2020/11/17 Python
关于探究python中sys.argv时遇到的问题详解
2021/02/23 Python
Vrbo英国:预订度假屋
2020/08/19 全球购物
如何写好升职自荐信
2014/01/06 职场文书
中学优秀班主任事迹材料
2014/05/01 职场文书
市场营销战略计划书
2014/05/06 职场文书
房地产营销活动策划方案
2014/09/15 职场文书
工作汇报开头与结尾怎么写
2014/11/08 职场文书
2014年行政工作总结
2014/11/19 职场文书
邀请函的格式
2015/01/30 职场文书
服务员岗位职责
2015/02/03 职场文书
redis调用二维码时的不断刷新排查分析
2022/04/01 Redis