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 用原型继承来实现对象系统
Mar 22 Javascript
jquery利用event.which方法获取键盘输入值的代码
Oct 09 Javascript
js实现从中间开始往上下展开网页窗口的方法
Mar 02 Javascript
jQuery实用技巧必备(上)
Nov 02 Javascript
详解AngularJS过滤器的使用
Mar 11 Javascript
Bootstrap模仿起筷首页效果
May 09 Javascript
基于JS模仿windows文件按名称排序效果
Jun 29 Javascript
Angular2学习笔记——详解路由器模型(Router)
Dec 02 Javascript
微信小程序实现蓝牙打印
Sep 23 Javascript
vue 自定义右键样式的实例代码
Nov 06 Javascript
关于AngularJS中几种Providers的区别总结
May 17 Javascript
Vue v-for中的 input 或 select的值发生改变时触发事件操作
Aug 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网站地图生成类示例
2014/01/13 PHP
实例介绍PHP删除数组中的重复元素
2019/03/03 PHP
一文看懂PHP进程管理器php-fpm
2020/06/01 PHP
javascript编程起步(第一课)
2007/01/10 Javascript
JavaScript 编程引入命名空间的方法与代码
2007/08/13 Javascript
获取offsetTop和offsetLeft值的js代码(兼容)
2013/04/16 Javascript
js通过地址栏给action传值(中文乱码全是问号)
2013/05/02 Javascript
jquery选择checked在ie8普通模式下的问题
2014/02/12 Javascript
js的延迟执行问题分析
2014/06/23 Javascript
简单的jQuery拖拽排序效果的实现(增强动态)
2017/02/09 Javascript
jQuery.Ajax()的data参数类型详解
2017/07/23 jQuery
前端把html表格生成为excel表格的实例
2017/09/19 Javascript
vue better scroll 无法滚动的解决方法
2018/06/07 Javascript
JavaScript实现的简单Tab点击切换功能示例
2018/07/06 Javascript
Vue实现商品详情页的评价列表功能
2019/09/04 Javascript
在vue中实现清除echarts上次保留的数据(亲测有效)
2020/09/09 Javascript
跟老齐学Python之私有函数和专有方法
2014/10/24 Python
python让图片按照exif信息里的创建时间进行排序的方法
2015/03/16 Python
使用Python来开发Markdown脚本扩展的实例分享
2016/03/04 Python
开源Web应用框架Django图文教程
2017/03/09 Python
Python的标准模块包json详解
2017/03/13 Python
Python实现一个简单的验证码程序
2017/11/03 Python
基于Django用户认证系统详解
2018/02/21 Python
Python面向对象之静态属性、类方法与静态方法分析
2018/08/24 Python
我就是这样学习Python中的列表
2019/06/02 Python
简单了解python协程的相关知识
2019/08/31 Python
python xlwt如何设置单元格的自定义背景颜色
2019/09/03 Python
Python读取csv文件实例解析
2019/12/30 Python
设计师大码女装:11 Honoré
2020/05/03 全球购物
新东网科技Java笔试题
2012/07/13 面试题
新员工培训个人的自我评价
2013/10/09 职场文书
军训生自我鉴定范文
2013/12/27 职场文书
考研英语复习计划
2015/01/19 职场文书
校运会广播稿
2015/08/19 职场文书
2016寒假社会实践心得体会范文
2015/10/09 职场文书
字节飞书面试promise.all实现示例
2022/06/16 Javascript