js的匿名函数 和普通函数
匿名函数在声明时不用带上函数名, 可以把匿名函数当作一个function类型的值来对待
声明一个普通的函数 function func() { ... } 可以认为和var func = function() { ... };相同, 但是普通函数会自动把函数名"提到"作用域的最前面, 基本上普通函数和匿名函数就只有这一个区别
|
1
2
3
4
5
6
7
|
function xxx() { foo(); //foo被提到了作用域的最前面, 于是这里可以正常调用foo函数 bar(); //这里会报错bar是个undefined function foo(){} var bar = function(){};} |
匿名函数可以有效的保证在页面上写入Javascript,而不会造成全局变量的污染。
这在给一个不是很熟悉的页面增加Javascript时非常有效,也很优美。
一、什么是匿名函数?
在Javascript定义一个函数一般有如下三种方式:
函数关键字(function)语句:
function fnMethodName(x){alert(x);}
函数字面量(Function Literals):
var fnMethodName = function(x){alert(x);}
Function()构造函数:
var fnMethodName = new Function('x','alert(x);')
上面三种方法定义了同一个方法函数fnMethodName,
第1种就是最常用的方法,后两种都是把一个函数复制给变量fnMethodName,而这个函数是没有名字的,即匿名函数。
实际上,相当多的语言都有匿名函数。
二、函数字面量和Function()构造函数的区别
虽然函数字面量是一个匿名函数,但语法允许为其指定任意一个函数名,当写递归函数时可以调用它自己,使用Function()构造函数则不行。
var f = function fact(x) { if (x < = 1) return 1; else return x*fact(x-1); };
Function()构造函数允许运行时Javascript代码动态的创建和编译。在这个方式上它类似全局函数eval()。
Function()构造函数每次执行时都解析函数主体,并创建一个新的函数对象。所以当在一个循环或者频繁执行的函数中调用Function()构造函数的效率是非常低的。相反,函数字面量却不是每次遇到都重新编译的。
用Function()构造函数创建一个函数时并不遵循典型的作用域,它一直把它当作是顶级函数来执行。
var y = "global";
function constructFunction() { var y = "local"; return new Function("return y"); // 无法获取局部变量 } alert(constructFunction()()); // 输出 “global”和函数关键字定义相比Function()构造器有自己的特点且要难以使用的多,
所以这项技术通常很少使用。
而函数字面量表达式和函数关键字定义非常接近。
考虑前面的区别,虽然有消息说字面量的匿名函数在OS X 10.4.3下的某些webkit的引擎下有bug,
但我们平常所说的匿名函数均指采用函数字面量形式的匿名函数。
三、匿名函数的代码模式
错误模式:其无法工作,浏览器会报语法错。
function(){ alert(1); }();
函数字面量:首先声明一个函数对象,然后执行它。
(function(){ alert(1); } ) ( );
优先表达式:
( function(){ alert(2); } ( ) );
void操作符:
void function(){ alert(3); }()这三种方式是等同的,hedger wang因为个人原因比较喜欢第3种,而在实际应用中我看到的和使用的都是第1种。
四、匿名函数的应用
《Javascript的一种模块模式》中的第一句话就是“全局变量是魔鬼”。
配合var关键字,匿名函数可以有效的保证在页面上写入Javascript,而不会造成全局变量的污染。
这在给一个不是很熟悉的页面增加Javascript时非常有效,也很优美。
实际上,YUI以及其相应的范例中大量使用匿名函数,其他的Javascript库中也不乏大量使用。
Javascript的函数式编程(functional programming)的基石。
具体请看《用函数式编程技术编写优美的 JavaScript》和《函数式JavaScript编程指南》。
js的匿名函数 和普通函数的更多相关文章
- js处理匿名函数
首先js 有DOM0 和DOM2级事件 DOM 0级事件处理一般是直接把一个函数分配给一个事件处理程序,既可以在元素中直接分配一个事件处理程序 一个元素可以绑定多个事件 DOM0: <div i ...
- JS匿名函数自执行函数
JS匿名函数自执行函数:(function(){})();(function(){}) 这是一个函数,函数后面接(),则是调用函数 比如(function(arg){console.log(arg); ...
- js重点--匿名函数
推荐博客:https://www.cnblogs.com/pssp/p/5216668.html 函数是必须要有函数名的,不然没有办法找到它,使用它. 如果没有名字必须要有一个依附体,如:将这个匿名函 ...
- js中匿名函数和回调函数
匿名函数: 通过这种方式定义的函数:(没有名字的函数) 作用:当它不被赋值给变量单独使用的时候 1.将匿名函数作为参数传递给其他函数 2.定义某个匿名函数来执行某些一次性任务 var f = func ...
- js中 函数声明/函数表达式/匿名函数/箭头函数/立即执行函数
函数声明: function add(a, b) { // ... } 1.顾名思义,声明一个函数, 用关键字 “function” 来告诉,这是一个函数. 2.任何地方,想用就可以拿过来使用 函数表 ...
- node.js中的匿名函数, 回调函数和嵌套函数
定义一个函数相信大家已经很熟悉了, 在javascript里的函数也是非常重要的, 使用率非常高, 有几种函数不是很好理解 一, 匿名函数 var remove = function(num1) { ...
- js中匿名函数的N种写法
匿名函数没有实际名字,也没有指针,怎么执行? 关于匿名函数写法,很发散~ +号是让函数声明转换为函数表达式.汇总一下 最常见的用法: 代码如下: (function() { alert('water ...
- JS中的匿名函数、回调函数、匿名回调函数
工欲善其事必先利其器 在学习JavaScript设计模式一书时,遇到了“匿名回调函数”这个概念,有点疑惑,查找了些资料重新看了下函数的相关知识点之后,对这个概念有了认识.九层之台,起于垒土.在熟悉这一 ...
- js、匿名函数、闭包、回调函数
234567891011121314151617181920212223242526272829303132333435 闭包 闭包:闭包是指有权访问另一个函数作用域中的变量的函数 函数嵌套一个函数, ...
- JavaScript 函数声明,函数表达式,匿名函数,立即执行函数之区别
函数声明:function fnName () {-};使用function关键字声明一个函数,再指定一个函数名,叫函数声明. 函数表达式 var fnName = function () {-};使 ...
随机推荐
- iOS 图文混排
使用系统自带的NSAttributedString来处理,对于一般的图文混排已经足够了,但是,有一个缺点就是NSAttributedString并不支持gif动画.实际上,使用gif动画还是挺卡的. ...
- gitlab8.2->8.16->8.17->9.0升级
注:不要跨过8.16升级至8.17,这样做升级过程会报错 ###################################8.2升级至8.16########################## ...
- 海量交通大数据应用平台MTDAP_nchang的经验记录
WRONGTYPE Operation against a key holding the wrong kind of value 根本的就是redis同一个key的value值前后类型不一致,比如最 ...
- Linux rz命令无效
rz命令无效 我习惯使用SecureCRT工具,进行远程连接Linux服务器,在进行文件传输的时候,可以使用sftp (alt+p)方式进行传输文件,也经常使用rz命令进行图形化的方式传输文件. 当r ...
- db2修改表结构,增加列,删除列等
增加一列:ALTER TABLE tbname ADD COLUMN columnName datatype; 增加多列:ALTER TABLE tbname ADD COLUMN columnNam ...
- Jenkins实现自动化部署
首先登录到服务器,目前我所使用的program-DEV环境所在服务器为:IP 登录密码为:密码 1.基础配置 检查所有环境变量: $ env 2.下载安装包安装 JDK:由于本机器已经安装,这 ...
- sqlserver字符集问题(中文出乱码,排序错误等)
在创建sqlserver 数据库时未指定排序字符集,databases则会使用instances的排序规则.为了支持中文,需要设置成Chinese_PRC_CI_AS. (1)通过sql脚本修改 -- ...
- OpenGL and Vulkan resources
OpenGL https://www.zhihu.com/question/22005157https://open.gl/https://github.com/cybercser/OpenGL_3_ ...
- Yii Restful api认证
- jsp页面报错 javax.servlet cannot be resolved to a type
需要引入 Tomcat 中的两个 jar 包: servlet-api jsp-api.jar