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 相关文章推荐
Jquery 组合form元素为json格式,asp.net反序列化
Jul 09 Javascript
javascript返回顶部效果(自写代码)
Jan 06 Javascript
JQuery中绑定事件(bind())和移除事件(unbind())
Feb 27 Javascript
js return返回多个值,通过对象的属性访问方法
Feb 21 Javascript
微信小程序 扎金花简单实例
Feb 21 Javascript
详解angular ui-grid之过滤器设置
Jun 07 Javascript
JavaScript截屏功能的实现代码
Jul 28 Javascript
详解VSCode配置启动Vue项目
May 14 Javascript
Vuex,iView UI面包屑导航使用扩展详解
Nov 04 Javascript
解决vue-router路由拦截造成死循环问题
Aug 05 Javascript
Vue中 axios delete请求参数操作
Aug 25 Javascript
解决iview table组件里的 固定列 表格不自适应的问题
Nov 13 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 session常见问题集锦及解决办法总结
2007/03/18 PHP
不错的PHP学习之php4与php5之间会穿梭一点点感悟
2007/05/03 PHP
php编写一个简单的路由类
2011/04/13 PHP
解析php框架codeigniter中如何使用框架的session
2013/06/24 PHP
php获取目标函数执行时间示例
2014/03/04 PHP
PHP中Session引起的脚本阻塞问题解决办法
2014/04/08 PHP
Extjs学习笔记之六 面版
2010/01/08 Javascript
页面调用单个swf文件,嵌套出多个方法。
2011/11/21 Javascript
全面总结Javascript对数组对象的各种操作
2017/01/22 Javascript
JS实现JSON.stringify的实例代码讲解
2017/02/07 Javascript
值得分享和收藏的xmlplus组件学习教程
2017/05/05 Javascript
微信小程序实现人脸识别
2018/05/25 Javascript
浅谈在react中如何实现扫码枪输入
2018/07/04 Javascript
vue2.0 中使用transition实现动画效果使用心得
2018/08/13 Javascript
vue-router判断页面未登录自动跳转到登录页的方法示例
2018/11/04 Javascript
详解vue项目打包步骤
2019/03/29 Javascript
vue从零实现一个消息通知组件的方法详解
2020/03/16 Javascript
Vue实现开关按钮拖拽效果
2020/09/22 Javascript
梳理一下vue中的生命周期
2020/12/30 Vue.js
[02:53]2018年度DOTA2最佳战队-完美盛典
2018/12/17 DOTA
从CentOS安装完成到生成词云python的实例
2017/12/01 Python
python读取有密码的zip压缩文件实例
2019/02/08 Python
在python 中split()使用多符号分割的例子
2019/07/15 Python
基于Python实现签到脚本过程解析
2019/10/25 Python
python实现的多任务版udp聊天器功能案例
2019/11/13 Python
python实现ip地址的包含关系判断
2020/02/07 Python
基于Keras 循环训练模型跑数据时内存泄漏的解决方式
2020/06/11 Python
Python装饰器结合递归原理解析
2020/07/02 Python
Django使用django-simple-captcha做验证码的实现示例
2021/01/07 Python
完美解决torch.cuda.is_available()一直返回False的玄学方法
2021/02/06 Python
局部内部类是否可以访问非final变量?
2013/04/20 面试题
幼儿园教育教学反思
2014/01/31 职场文书
中式婚礼主持词
2014/03/13 职场文书
2015年小学师德师风建设工作总结
2015/10/23 职场文书
如何使用flask将模型部署为服务
2021/05/13 Python
springboot项目以jar包运行的操作方法
2021/06/30 Java/Android