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 相关文章推荐
ExtJS4 组件化编程,动态加载,面向对象,Direct
May 12 Javascript
javaScript实现浮点数转十六进制字符
Oct 29 Javascript
在JavaScript中判断整型的N种方法示例介绍
Jun 18 Javascript
以WordPress为例讲解jQuery美化页面Title的方法
May 23 Javascript
Javascript中的数组常用方法解析
Jun 17 Javascript
真正好用的js验证上传文件大小的简单方法
Oct 27 Javascript
JS实现微信弹出搜索框 多条件查询功能
Dec 13 Javascript
bootstrap提示标签、提示框实现代码
Dec 28 Javascript
ES6生成器用法实例分析
Apr 10 Javascript
vue如何从接口请求数据
Jun 22 Javascript
JSON数据中存在单个转义字符“\”的处理方法
Jul 11 Javascript
深入浅析Node环境和浏览器的区别
Aug 14 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
mysql时区问题
2008/03/26 PHP
php中explode与split的区别介绍
2012/10/03 PHP
解决PHP Opcache 缓存刷新、代码重载出现无法更新代码的问题
2020/08/24 PHP
扩展String功能方法
2006/09/22 Javascript
javascript 面向对象全新理练之原型继承
2009/12/03 Javascript
js RuntimeObject() 获取ie里面自定义函数或者属性的集合
2010/11/23 Javascript
JS+CSS设置img在DIV中只显示Img垂直居中的部分
2013/10/24 Javascript
javascript实现修改微信分享的标题内容等
2014/12/11 Javascript
JS实现网页滚动条感应鼠标变色的方法
2015/02/26 Javascript
jQuery双向列表选择器DIV模拟版
2016/11/01 Javascript
vuejs指令详解
2017/02/07 Javascript
js 作用域和变量详解
2017/02/16 Javascript
JavaScript设计模式之原型模式分析【ES5与ES6】
2018/07/26 Javascript
详解vuex 渐进式教程实例代码
2018/11/27 Javascript
详解vue.js移动端配置flexible.js及注意事项
2019/04/10 Javascript
简单了解vue中父子组件如何相互传递值(基础向)
2019/07/12 Javascript
Vue.use()在new Vue() 之前使用的原因浅析
2019/08/26 Javascript
vue element 中的table动态渲染实现(动态表头)
2019/11/21 Javascript
JS数据类型STRING使用实例解析
2019/12/18 Javascript
jquery实现简易验证插件封装
2020/09/13 jQuery
好的Python培训机构应该具备哪些条件
2018/05/23 Python
Python中存取文件的4种不同操作
2018/07/02 Python
python并发和异步编程实例
2018/11/15 Python
Python API 自动化实战详解(纯代码)
2019/06/11 Python
Pycharm导入anaconda环境的教程图解
2020/07/31 Python
Pycharm2020.1安装无法启动问题即设置中文插件的方法
2020/08/07 Python
在django中查询获取数据,get, filter,all(),values()操作
2020/08/09 Python
localStorage 设置过期时间的方法实现
2018/12/21 HTML / CSS
销售心得体会
2014/01/02 职场文书
幼师自我鉴定
2014/02/01 职场文书
重大事项社会稳定风险评估方案
2014/06/15 职场文书
销售人员工作自我评价
2014/09/21 职场文书
2014年卫生院工作总结
2014/12/03 职场文书
党支部书记岗位职责
2015/02/15 职场文书
同学会演讲稿
2019/04/02 职场文书
励志语录:你若不勇敢,谁替你坚强
2019/11/08 职场文书