( function(){…} )()

javascript和其他编程语言相比比较随意,所以javascript代码中充满各种奇葩的写法,有时雾里看花,当然,能理解各型各色的写法也是对javascript语言特性更进一步的深入理解。

( function(){…} )()和( function (){…} () )是两种javascript立即执行函数的常见写法,最初我以为是一个括号包裹匿名函数,再在后面加个括号调用函数,最后达到函数定义后立即执行的目的,后来发现加括号的原因并非如此。要理解立即执行函数,需要先理解一些函数的基本概念。

函数声明、函数表达式、匿名函数

函数声明:function fnName () {…};使用function关键字声明一个函数,再指定一个函数名,叫函数声明。

函数表达式 var fnName = function () {…};使用function关键字声明一个函数,但未给函数命名,最后将匿名函数赋予一个变量,叫函数表达式,这是最常见的函数表达式语法形式。

匿名函数:function () {}; 使用function关键字声明一个函数,但未给函数命名,所以叫匿名函数,匿名函数属于函数表达式,匿名函数有很多作用,赋予一个变量则创建函数,赋予一个事件则成为事件处理程序或创建闭包等等。

函数声明和函数表达式不同之处在于,一、Javascript引擎在解析javascript代码时会‘函数声明提升’(Function declaration Hoisting)当前执行环境(作用域)上的函数声明,而函数表达式必须等到Javascirtp引擎执行到它所在行时,才会从上而下一行一行地解析函数表达式,二、函数表达式后面可以加括号立即调用该函数,函数声明不可以,只能以fnName()形式调用 。以下是两者差别的两个例子。

fnName();
function fnName(){...
}
//正常,因为‘提升’了函数声明,函数调用可在函数声明之前
 
fnName();
var fnName=function(){...
}
//报错,变量fnName还未保存对函数的引用,函数调用必须在函数表达式之后
var fnName=function(){alert('Hello World');
}();
//函数表达式后面加括号,当javascript引擎解析到此处时能立即调用函数
function fnName(){alert('Hello World');
}();
//不会报错,但是javascript引擎只解析函数声明,忽略后面的括号,函数声明不会被调用
function(){console.log('Hello World');    
}();
//语法错误,虽然匿名函数属于函数表达式,但是未进行赋值操作,
//所以javascript引擎将开头的function关键字当做函数声明,报错:要求需要一个函数名

在理解了一些函数基本概念后,回头看看( function(){…} )()和( function (){…} () )这两种立即执行函数的写法,最初我以为是一个括号包裹匿名函数,并后面加个括号立即调用函数,当时不知道为什么要加括号,后来明白,要在函数体后面加括号就能立即调用,则这个函数必须是函数表达式,不能是函数声明

(function(a){console.log(a);   //firebug输出123,使用()运算符
})(123);(function(a){console.log(a);   //firebug输出1234,使用()运算符
}(1234));!function(a){console.log(a);   //firebug输出12345,使用!运算符
}(12345);+function(a){console.log(a);   //firebug输出123456,使用+运算符
}(123456);-function(a){console.log(a);   //firebug输出1234567,使用-运算符
}(1234567);var fn=function(a){console.log(a);   //firebug输出12345678,使用=运算符
}(12345678)

可以看到输出结果,在function前面加!、+、 -甚至是逗号等到都可以起到函数定义后立即执行的效果,而()、!、+、-、=等运算符,都将函数声明转换成函数表达式,消除了javascript引擎识别函数表达式和函数声明的歧义,告诉javascript引擎这是一个函数表达式,不是函数声明,可以在后面加括号,并立即执行函数的代码。

加括号是最安全的做法,因为!、+、-等运算符还会和函数的返回值进行运算,有时造成不必要的麻烦。

不过这样的写法有什么用呢?

javascript中没用私有作用域的概念,如果在多人开发的项目上,你在全局或局部作用域中声明了一些变量,可能会被其他人不小心用同名的变量给覆盖掉,根据javascript函数作用域链的特性,可以使用这种技术可以模仿一个私有作用域,用匿名函数作为一个“容器”,“容器”内部可以访问外部的变量,而外部环境不能访问“容器”内部的变量,所以( function(){…} )()内部定义的变量不会和外部的变量发生冲突,俗称“匿名包裹器”或“命名空间”。

JQuery使用的就是这种方法,将JQuery代码包裹在( function (window,undefined){…jquery代码…} (window)中,在全局作用域中调用JQuery代码时,可以达到保护JQuery内部变量的作用。

转载于:https://www.cnblogs.com/firebata/p/4630000.html

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

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

相关文章

谈谈 css 的各种居中——读编写高质量代码有感

css 的居中有水平居中和垂直居中&#xff0c;这两种居中又分为行内元素居中和块级元素居中&#xff0c;不同的居中用不同方法。 水平居中 1、行内元素水平居中&#xff08;文本&#xff0c;图片&#xff09; 给父层设置 text-align:center; 可以实现行内元素水平居中。 <!DO…

.NET遗留应用改造——性能优化篇

由于各种原因我们总是要与公司各种老项目打交道。天有不测风云&#xff0c;谁也不知道这坨屎山会从哪个方向把你的嘴塞的满满的&#xff0c;还不让你吐出来。既然如此...那只能细嚼慢咽的吞下去吧。说实在话&#xff0c;只要业务不死&#xff0c;那些老大伯项目就还有价值。更何…

华为西安工业大学鸿蒙,培养百位将领、19位院士,这所211大学被誉为“华为人的母校”...

在社会上&#xff0c;985工程重点大学认可度是普遍要比211工程大学高的&#xff0c;并且985工程大学实力也比较强。但比较例外的是&#xff0c;华为这个让国人骄傲的企业&#xff0c;对一个211工程大学青睐程度却超过了绝大部分985工程大学&#xff0c;这所211大学甚至还被誉为…

Android Studio之Instant Run requires ‘Tools | Android | Enable ADB integration‘ to be enabled解决办法

1、问题 Android studio运行项目时候出现这个提示 Instant Run requires Tools | Android | Enable ADB integration to be enabled 2、原因 由于新版本中的Instant Run &#xff08;即时运行&#xff09;引起的 官方介绍 即使运行 https://developer.android.com/studio/r…

C# 11 预览,又增加了实用的语法糖

文 | 罗奇奇出品 | OSC开源社区&#xff08;ID&#xff1a;oschina2013&#xff09;.NET 首席项目经理凯瑟琳在博客中介绍了 C# 11 的一些预览性新功能&#xff0c;这些功能可以在 Visual Studio 17.1 和 .NET SDK 6.0.200 中体验&#xff0c;下面摘录一部分新特性作介绍&#…

java程序

This XML file does not appear to have any style information associated with it. The document tree is shown below.博客园_首页代码改变世界uuid:5de59c50-a92f-4447-96ed-ab86451ed183;id61182014-07-27T11:59:08Zfeed.cnblogs.comhttp://www.cnblogs.com/jianyus/p/386…

使用Blazor做个简单的时间戳在线转换工具

时间戳转换时间戳转换&#xff0c;关键点在于双向绑定bind-Value&#xff0c;就简单贴源码吧TimestampTool.razorpage "/timestamp" using BlazorComponent.I18n layout PublicLayout<PageTitle>T("TimestampToolTitle")</PageTitle><h2 st…

转载:Pixhawk源码笔记一:APM代码基本结构

转自 新浪微博WalkAnt 基础知识 详细参考&#xff1a;http://dev.ardupilot.com/wiki/learning-the-ardupilot-codebase/ 第一部分&#xff1a;介绍 详细参考&#xff1a;http://dev.ardupilot.com/wiki/learning-ardupilot-introduction/ ArduPilot 代码分为5个主要部分&…

nginx+tomcat8+memcached实现session共享具体操作

本次试验用到的软件包的版本如下&#xff1a;一、针对10.43.2.134的操作1.安装jdk环境tar zxf jdk-8u5-linux-x64.tar.gz mkdir /usr/javamv jdk1.8.0_05/ /usr/java/编辑/etc/profile在文档的末尾追加如下5行内容&#xff1a;JAVA_HOME/usr/java/jdk1.8.0_05JRE_HOME/usr/java…

.NET6之MiniAPI(十九):NLog

在本系例文章的第八篇中&#xff0c;我们聊过官方的日志实现&#xff0c;即《.NET6之MiniAPI(八)&#xff1a;日志》。但官方的日志功能更多是提供了一个实现基础&#xff0c;对于要求一个灵活&#xff0c;强大&#xff0c;方便的日志体系&#xff0c;官方的还是有差距的&#…

完美:C# Blazor中显示Markdown并添加代码高亮

昨天发了一篇介绍这个库&#xff1a;C# Blazor中显示Markdown文件&#xff0c;介绍怎么在Blazor中显示Markdown内容的文章&#xff0c;文章内的代码是没有高亮的&#xff0c;思来相去&#xff0c;还是要做好&#xff0c;于是百度到这篇文章.NET C# Blazor 服务端渲染Markdown&a…

使用 FieldMask 提高 C# gRpc 服务性能

前言想象一下&#xff0c;有一个服务提供个多个客户端调用&#xff0c;但不是所有客户端都需要全部的返回参数:比如商品列表服务返回商品的所有信息&#xff0c;而订单服务调用商品列表服务&#xff0c;但它其实只需要商品的编码和名称就够了。当然&#xff0c;我们可以为这个需…

HTML accesskey 属性

2019独角兽企业重金招聘Python工程师标准>>> 带有指定快捷键的超链接&#xff1a; <a href"http://www.w3school.com.cn/html/" accesskey"h">HTML</a><br /> <a href"http://www.w3school.com.cn/css/" access…

Linux 2.6 完全公平调度算法CFS(Completely Fair Scheduler) 分析

转会http://www.ibm.com/developerworks/cn/linux/l-completely-fair-scheduler/index.html?cadrs-cn-0125 Linux 调度器简史 早期的 Linux 调度器使用了最低的设计&#xff0c;它显然不关注具有非常多处理器的大型架构&#xff0c;更不用说是超线程了。1.2 Linux 调度器使用了…

在计算机技术方面用英语怎么说,“计算机应用技术”用英语怎么说?

计算机应用技术 :1. Computer Applications Technology中国搜学网-学苑论坛 - 教育话题 - 学习交流 ... ...专利文献检索 The Searches of Patent Literature计算机应用技术 Computer Applications Technology精密电磁测量 Precise Electromagnetic Measurement ...2. Computer…

linux之nautilus .命令浏览当前文件目录

1、比如我们在终端目前想打开这个路径下的文件目录&#xff0c;我们如果再去更加路径一个一个的打&#xff0c;就太浪费时间了&#xff0c;我们可以在终端这个路径下输入下面的命令就可以 ~/Desktop$ nautilus . 2、效果如下图

C# 异步与Windows应用程序

把 async 关键字用于 UWP 应用程序&#xff0c;需要注意&#xff0c;在 UI 线程中调用 await 之后&#xff0c;当异步方法返回时&#xff0c;将默认返回到 UI 线程中。这便于在异步方法完成后更新 UI 元素。注意为了创建 UWP 应用程序&#xff0c;需要 Windows 10&#xff0c;W…

重装系统后恢复oracle数据

2019独角兽企业重金招聘Python工程师标准>>> 由于前段时间重装了系统&#xff0c;今天重装了数据库oracle XE版本&#xff0c;用“移花接木”的手段将新装oracle的目录用原有目录直接给覆盖&#xff0c;于是顺利的启动了oracle服务&#xff0c;然后又打开plsql deve…

java Split 用法

在java.lang包中有String.split()方法,返回是一个数组 我在应用中用到一些,给大家总结一下,仅供大家参考: 1、如果用“.”作为分隔的话,必须是如下写法,String.split("\\."),这样才能正确的分隔开,不能用String.split("."); 2、如果用“|”作为分隔的话,必…

html三列布局源码,HTML三列布局 - 黄柳淞的个人页面 - OSCHINA - 中文开源技术交流社区...

1.三列布局1三列布局body{padding: 0;margin: 0;}.left{width:33.3%;height: 500px;background-color: #ccc;float: left;}.middle{width:33.3%;height: 500px;background-color: #bbb;float: left;}.right{width:33.3%;height: 500px;background-color: #aaa;float: left;}33.…