javascript立即调用的函数表达式

 1. 什么是自执行的匿名函数?

它是指形如这样的函数: (function {// code})();

2. 疑问
为什么(function {// code})();可以被执行, 而function {// code}();却会报错?

3. 分析
(1). 首先, 要清楚两者的区别:
(function {// code})是表达式, function {// code}是函数声明.
(2). 其次, js"预编译"的特点:
js在"预编译"阶段, 会解释函数声明, 但却会忽略表式.
(3). 当js执行到function() {//code}();时, 由于function() {//code}在"预编译"阶段已经被解释过, js会跳过function(){//code}, 试图去执行();, 故会报错;
当js执行到(function {// code})();时, 由于(function {// code})是表达式, js会去对它求解得到返回值, 由于返回值是一 个函数, 故而遇到();时, 便会被执行.

另外, 函数转换为表达式的方法并不一定要靠分组操作符(),我们还可以用void操作符,~操作符,!操作符……
如:

!function(){      alert("另类的匿名函数自执行");    }(); 

 

佚名函数()() (())
 
(function() {alert('hello')}
)();

 

(function(v) {alert(v)}
)('hello');

 

 

 
(function() {alert('hello')}
());

 

(function(v) {alert(v)}
('hello'));

 

 

 有名函数()() (())
(function fn() {alert('hello')}
)();

 

(function fn() {alert('hello')}
());

 

对象函数()()  对象函数(())
({  init:function(){  alert('hello')  }  
}).init();

 

 ({  init:function(){  alert('hello')  }  
}.init());

 

对象内部() 不可这样调用
var foo = { fn: function (x) {return x % 2 != 0 ? 'yes' : 'no';}(1)
}; 
alert(foo.fn); // 'yes'

 

var foo = { fn: function (x) {return x % 2 != 0 ? 'yes' : 'no';}(1)
}; 
alert(foo.fn()); 

 

对象+","+函数+()“对象”可以为如下,自己可试
1, function () {alert('anonymous function is called');
}();

 

1、任意数字
2、特殊字符(!、~、- 、+)
3、void
4、true、false
当然这些也可以组合使用。
()应用,设计模式之单例模式 自定义对象
//()应用var Singleton = (function () {function init() {/*这里定义单例代码*/return {publicMethod: function () {alert('hello world');}};}return {getInstance: function () {return init();}};})();/*调用公有的方法来获取实例:*/Singleton.getInstance().publicMethod();

 

 
var obj = {};
(function (q) {q.publish = function (str) {alert(str);}} (obj));   //提交obj全局对象
obj.publish('hello');//hello

 

(function (a) {a.publish = function (str) {alert(str);}
} (window));        //window对象
publish('hello');

 

著名应用实例:jQuery 设计模式之迭代器模式 
 
(function() {
var jQuery = (function() {//构建jQuery对象var jQuery = function() {//实例init()return new jQuery.fn.init();};jQuery.fn = jQuery.prototype = { constructor: jQuery,init: function() {var match;},            jQuery: "1.7.1"};// 合并 init()的属性为jQuery.fn  jQuery.fn.init.prototype = jQuery.fn;//返回jQuery      return jQuery
})();
//定义jQuery全局对象
window.jQuery = window.$ = jQuery;
})(window);  //应用实例
alert($().jQuery);//1.7.1

 

var fn = (function () {var index = 0,data = [1, 2, 3, 4, 5],length = data.length;return {            length: length,rewind: function () {index = 0;},current: function () {return data[index];}};
} ());
alert(fn.current());

 

根据参数选择执行对象 
 
var fn=(function(){var obj={i1:function(){return 'a';}(),i2:function(){return 'b';}()};//json格式,可以无序排列var json={"1":"i1","2":"i2"};//array数组,有序排列// var ar=["i11","i12"]; return {init:function(i){return obj[json[i]];}};
})();
alert(fn.init(1));

 

 
return {ini: function(X) { //声明一个函数,名称为iniX.__MSG_QS__ = {}; //为传进来的对象添加属性X.on = C; //为传进来的对象添加方法X.dm = G; //为传进来的对象添加方法return X}}

  

使用闭包:

(function($) {
  
// Code goes here
})(jQuery);

这是来自jQuery官方的插件开发规范要求,使用这种编写方式有什么好处呢?

a) 避免全局依赖。

b) 避免第三方破坏。

c) 兼容jQuery操作符'$'和'jQuery '

我们知道这段代码在被解析时会形同如下代码:

var jq = function($) {
  
// Code goes here
};
jq(jQuery);

 

 
利用匿名函数绑定事件
var obj = document.getElementById("psd");obj.οnclick=(function(){return function(){alert('i');}})()

  

 
1.佚名函数
function() {
// 
}2.分组正则调用佚名函数
(function() {
// 
})(); 3.定时调用佚名函数
setTimeout(function(){alert('msg'));4.佚名函数返回对象
var bird = (function() {return { type: pro,attack: func};
}());
5.给佚名函数传弟参数,等价4
(function( bird ) {bird.type = "red";bird.attack = function() {};
}( window.bird = window.bird || {} ));

 

 

转载于:https://www.cnblogs.com/sntetwt/archive/2012/09/11/2679808.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/422213.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java的sha256_【java】SHA256加密工具

SHA256:/*** 备用方案 SHA256加密* author zx*/public class SHA256Util {public static void main(String[] args) {System.out.println(getSHA256StrJava("130"));System.out.println(getSHA256StrJava("130"));}public static String getSHA…

docker mysql详解_Docker 安装 mysql 详解

Docker 安装 mysql 详解制作its-mysql:1.0镜像说明:在使用基于centos+mysql的方式写Dockerfile做镜像,发现体积过于太大,是docker hub上提供的mysql镜像的大小3~4倍,docker hub上的大小为324MB,…

java openssl dgst_(7) openssl dgst(生成和验证数字签名)

该伪命令是单向加密工具,用于生成文件的摘要信息也可以进行数字签名,及验证数字签名。首先要明白的是,数字签名的过程是计算出摘要信息,然后使用私钥对摘要信息进行加密得到数字签名,而摘要是使用md5、sha512等单向散列…

烙饼啊烙饼{转自ITEO

一摞烙饼 博客分类: 编程1.有一些服务员会把上面的一摞饼子放在自己头顶上(放心,他们都戴着洁白的帽子),然后再处理其他饼子,在这个条件下,我们的算法能有什么改进? Java代码 int[] …

前端学习(553):node实现登录和注册第一部分代码

const http require(http); const url require(url) const querystring require(querystring) let user{admin:123456 } http.createServer((req,res)>{let path,get,post//如果是get请求if(req.methodGET){let{pathname,query} url.parse(req.url,true)pathpathname,ge…

java 不同分辨率_java9新特性-14-多分辨率图像 API

1.官方FeatureWindows and Linux2.产生背景在Mac上,JDK已经支持视网膜显示,但在Linux和Windows上,它并没有。在那里,Java程序在当前的高分辨率屏幕上可能看起来很小,不能使用它们。这是因为像素用于这些系统的大小计算…

前端学习(554):node实现登录和注册第二部分代码

jquery.min.js npm安装jQuery并引入 app.js const http require(http); const url require(url) const querystring require(querystring) const fs require(fs) let user{admin:12345 } http.createServer((req,res)>{let path,get,post//如果是get请求if(req.method…

[转]关于数据库的并发性的一个解决方案

我先把流程说出来,,比如修改一个记录:当用户点修改时,从数据库读出数据并显示到编辑菜单中,然后再编辑数据,再点确定保存到数据库中。如果多 个用户,当A用户点修改到保存该数据这一时间段&#…

encapsulation java_Java - 封装(Encapsulation)

Java - 封装(Encapsulation)Encapsulation是四个基本OOP概念之一。 其他三个是继承,多态和抽象。Java中的封装是将数据(变量)和作用于数据(方法)的代码作为一个单元包装在一起的机制。 在封装中,类的变量将从其他类隐藏,并且只能通过其当前类…

『AA』AutoAnchor自动猫

2012-09-17 19:40:31:嘿嘿,给自己出了道编程题,难度不大(YY都可以), 大家有兴趣可以自己去实现下。 文章目录 引子思路用法bug源代码 & 可执行文件引子 一篇博文如果太长的话,为博文标题添加…

前端学习(557):css与百分比单位

普通元素的百分比是按照元素的宽度决定的 绝对定位的百分比是按照第一个定位元素的容器的宽度计算的

java 微信隐藏右上角_React Js 微信禁止复制链接分享禁止隐藏右上角菜单功能

废话不多说了,直接给大家贴代码了,具体代码如下所示:/*** Created by wuyakun on 2017/5/23.*/let wxUtils {};/*** 是否开启右上角Menu* param open*/wxUtils.optionMenu function (open true) {if (open) {openOptionMenu();} else {dis…

JSP中文及传中文参数乱码解决方法小结

在使用JSP的过程中,最使人头疼的一个问题就是中文乱码问题,以下是我在软件开发中遇到的乱码问题以及解决方法。 1、JSP页面乱码 这种乱码的原因是应为没有在页面里指定使用的字符集编码,解决方法:只要在页面开始地方用下面代码指定…

java递归遍历xml所有元素_Java学习之Xml系列二:xml按条件查询、xml递归遍历所有元素和属性...

2019独角兽企业重金招聘Python工程师标准>>>xml中加入了几条,为了方便查询时作为示例。话不多说见代码注释:DTD文件:SwordTypeDefinition.dtdXML文件:SwordLib.xmlSwordLibrary SYSTEM "SwordTypeDefinition.dtd&qu…

调用IOS邮件系统发送邮件

1.导入MessageUI.framework框架2.在需要应用的控制器头文件&#xff1a;#import <MessageUI/MessageUI.h>&#xff0c;并加入委托&#xff1a;<MFMailComposeViewControllerDelegate>3.实现方法&#xff1a;-(void)displayComposerSheet { MFMailComposeViewCon…

list python 转tensor_Pytorch--Tensor, Numpy--Array,Python--List 相互之间的转换。

版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循CC 4.0 by-sa版权协议&#xff0c;转载请附上原文出处链接和本声明。本文链接&#xff1a;https://blog.csdn.net/weixin_37589575/article/details/994463941.1 List --> Arrary: np.array(List 变量)a [1, 2, 3, …