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 相关文章推荐
JSON传递bool类型数据的处理方式介绍
Sep 18 Javascript
JavaScript实现cookie的写入、读取、删除功能
Nov 05 Javascript
jQuery移动页面开发中的触摸事件与虚拟鼠标事件简介
Dec 03 Javascript
js仿iphone秒表功能 计算平均数
Jan 11 Javascript
JavaScript通过filereader接口读取文件
May 10 Javascript
深入理解JavaScript继承的多种方式和优缺点
May 12 Javascript
vue移动端裁剪图片结合插件Cropper的使用实例代码
Jul 10 Javascript
VuePress 中如何增加用户登录功能
Nov 29 Javascript
JS端基于download.js实现图片、视频时直接下载而不是打开预览
May 09 Javascript
微信小程序实现带放大效果的轮播图
May 26 Javascript
JS定时器如何实现提交成功提示功能
Jun 12 Javascript
three.js着色器材质的内置变量示例详解
Aug 16 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函数指定默认值方法的小例子
2013/12/04 PHP
php图片缩放实现方法
2014/02/20 PHP
php上传大文件失败的原因及应对策略
2015/10/20 PHP
PHP生成二维码与识别二维码的方法详解【附源码下载】
2019/03/07 PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
2019/12/20 PHP
javascript 一个函数对同一元素的多个事件响应
2009/07/25 Javascript
jQuery提交多个表单的小例子
2013/06/30 Javascript
用javascript删除当前行,添加行(示例代码)
2013/11/25 Javascript
jQuery同步提交示例代码
2015/12/12 Javascript
JavaScript实现复制内容到粘贴板代码
2016/03/31 Javascript
EasyUI学习之Combobox下拉列表(1)
2016/12/29 Javascript
图片懒加载插件实例分享(含解析)
2017/01/09 Javascript
jQuery在header中设置请求信息的方法
2017/03/06 Javascript
jQuery列表检索功能实现代码
2017/07/17 jQuery
基于vue-cli 路由 实现类似tab切换效果(vue 2.0)
2019/05/08 Javascript
通过实例解析chrome如何在mac环境中安装vue-devtools插件
2020/07/10 Javascript
[01:00:49]DOTA2-DPC中国联赛 正赛 Ehome vs iG BO3 第二场 1月31日
2021/03/11 DOTA
tensorflow实现简单的卷积神经网络
2018/05/24 Python
Python图像的增强处理操作示例【基于ImageEnhance类】
2019/01/03 Python
python实现Dijkstra静态寻路算法
2019/01/17 Python
pycharm激活码有效到2020年11月底
2020/09/18 Python
python构造函数init实例方法解析
2020/01/19 Python
Python selenium抓取虎牙短视频代码实例
2020/03/02 Python
python实现一次性封装多条sql语句(begin end)
2020/06/06 Python
使用PyWeChatSpy自动回复微信拍一拍功能的实现代码
2020/07/02 Python
印度网上购物首选目的地:Flipkart
2016/08/01 全球购物
Brother加拿大官网:打印机、贴标机、缝纫机
2019/10/09 全球购物
什么是接口(Interface)?
2013/02/01 面试题
12月小学生校园广播稿
2014/02/04 职场文书
寄语十八大感言
2014/02/07 职场文书
《浅水洼里的小鱼》听课反思
2014/02/28 职场文书
大学生简历求职信
2014/06/24 职场文书
2015政治思想表现评语
2015/03/25 职场文书
2015年机关党建工作总结
2015/05/22 职场文书
员工担保书范本
2015/09/22 职场文书
Windows和Linux上部署Golang并运行程序
2022/04/22 Servers