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 相关文章推荐
event对象的方法 兼容多浏览器
Jun 27 Javascript
jQuery的写法不同导致的兼容性问题的解决方法
Jul 29 Javascript
JavaScript内核之基本概念
Oct 21 Javascript
artDialog双击会关闭对话框的修改过程分享
Aug 05 Javascript
JS this作用域以及GET传输值过长的问题解决方法
Aug 06 Javascript
jQuery验证插件 Validate详解
Nov 20 Javascript
微信小程序 实例应用(记账)详解
Sep 28 Javascript
详解jQuery中的easyui
Sep 02 jQuery
react项目如何使用iconfont的方法步骤
Mar 13 Javascript
layer的prompt弹出框,点击回车,触发确定事件的方法
Sep 06 Javascript
javascript实现简单打字游戏
Oct 29 Javascript
JS如何调用WebAssembly编译出来的.wasm文件
Nov 05 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
9个PHP开发常用功能函数小结
2011/07/15 PHP
php二维数组转成字符串示例
2014/02/17 PHP
php用户注册时常用的检验函数实例总结
2014/12/22 PHP
PHP读取word文档的方法分析【基于COM组件】
2017/08/01 PHP
javascript生成/解析dom的CDATA类型的字段的代码
2007/04/22 Javascript
List Information About the Binary Files Used by an Application
2007/06/11 Javascript
jquery ui对话框实例代码
2013/05/10 Javascript
javascript中的__defineGetter__和__defineSetter__介绍
2014/08/15 Javascript
深入理解JavaScript系列(27):设计模式之建造者模式详解
2015/03/03 Javascript
简介JavaScript中Math.LOG10E属性的使用
2015/06/14 Javascript
javascript之with的使用(阿里云、淘宝使用代码分析)
2016/10/11 Javascript
基于JavaScript实现复选框的全选和取消全选
2017/02/09 Javascript
jQuery实现弹窗居中效果类似alert()
2017/02/27 Javascript
jQuery+ThinkPHP+Ajax实现即时消息提醒功能实例代码
2017/03/21 jQuery
JavaScript之json_动力节点Java学院整理
2017/06/29 Javascript
谈谈为什么你的 JavaScript 代码如此冗长
2019/01/30 Javascript
基于vue-cli搭建多模块且各模块独立打包的项目
2019/06/12 Javascript
JavaScript使用面向对象实现的拖拽功能详解
2019/06/12 Javascript
基于form-data请求格式详解
2019/10/29 Javascript
python cookielib 登录人人网的实现代码
2012/12/19 Python
10个易被忽视但应掌握的Python基本用法
2015/04/01 Python
Python实现单词翻译功能
2017/06/06 Python
新手入门Python编程的8个实用建议
2019/07/12 Python
基于TensorBoard中graph模块图结构分析
2020/02/15 Python
Django 多对多字段的更新和插入数据实例
2020/03/31 Python
解决在keras中使用model.save()函数保存模型失败的问题
2020/05/21 Python
CSS代码检查工具stylelint的使用方法详解
2021/03/27 HTML / CSS
酒店办公室文员岗位职责
2013/12/18 职场文书
《少年王勃》教学反思
2014/04/27 职场文书
国旗下讲话演讲稿
2014/05/08 职场文书
人大调研汇报材料
2014/08/14 职场文书
班子四风对照检查材料
2014/08/21 职场文书
2014村书记党建工作汇报材料
2014/11/02 职场文书
爱心捐书倡议书
2015/04/27 职场文书
城镇居民医疗保险工作总结
2015/08/10 职场文书
Win10此设备不支持接收Miracast无法投影的解决方法
2022/07/07 数码科技