JavaScript 匿名函数几种执行方式[通俗易懂]

JavaScript 匿名函数几种执行方式[通俗易懂]参考1、javascript自执行匿名函数  http://blog.csdn.net/jbgtwang/article/details/6608265其中说到了self-executinganonymousfunctions,有几种方式,最常见也比较容易理解的是:(function(){//dosomethinghere;})();格式:     (fun

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

 参考1、

javascript自执行匿名函数  http://blog.csdn.net/jbgtwang/article/details/6608265

其中说到了 self-executing anonymous functions,有几种方式,最常见也比较容易理解的是:

(function(){
//do something here;
})();
格式:
      (function(){
          //代码
        })();
解释:这是相当优雅的代码(如果你首次看见可能会一头雾水:)),包围函数(function(){})的第一对括号向脚本返回未命名的函数,随后一对空括号立即执行返回的未命名函数,括号内为匿名函数的参数。 来个带参数的例子:         (function(arg){            alert(arg+100);         })(20);         这个例子返回120。

( function(){…} )()和( function (){…} () )是两种javascript立即执行函数的常见写法

参考2、js中(function(){…})()立即执行函数写法理解

https://my.oschina.net/u/2331760/blog/468672?p=%7B%7BcurrentPage+1%7D%7D

最初我以为是一个括号包裹匿名函数,再在后面加个括号调用函数,最后达到函数定义后立即执行的目的,后来发现加括号的原因并非如此。要理解立即执行函数,需要先理解一些函数的基本概念。


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


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


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


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


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

实例:

JavaScript 匿名函数几种执行方式[通俗易懂]

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


JavaScript 匿名函数几种执行方式[通俗易懂]

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

还有一种方式为:

!function(){
  
  
// do something
}();

在这里开头要加上
 !
 或者 
~
 , 
–
 和
 +
。(note:都是英文符号)

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

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

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

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



版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/186211.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • android galley实现画廊效果

    android galley实现画廊效果青春流水指间、每段路,都有即将要来的旅程每颗心,都有值得期待的成分Android之ImageSwitcher,Gallery用法今天在做一个软件界面时用到了ImageSwitcher和Gallery控件,在看API时,感觉上面的例子讲的不是很具体,效率并不高。在这里我就以一个图片浏览功能来具体说明这两个控件的用法。首先看运行效果:在这里图片我用的是API中的图

    2022年5月16日
  • ”在禁用UAC时,无法激活此应用“问题

    ”在禁用UAC时,无法激活此应用“问题”在禁用UAC时,无法激活此应用“问题

    2022年4月24日
  • JS生成guid方法

    JS生成guid方法

    2022年4月2日
  • java对象转换为json字符串_java中将字符串转换为json

    java对象转换为json字符串_java中将字符串转换为json概要Jackson是基于java平台的json处理框架。Jackson提供了三种可选的json处理方法:流式API、树模型、数据绑定(dataBinding),其中数据绑定是最常用的处理方式;本文主要介绍数据绑定的处理方式。java对象与json字符串互相转换java对象与json字符串互相转换的关键就是ObjectMapper对象的writeValue()方法和readValue()方法;其中json字符串可以字符串的形式传入/传出,也可以以文件的形式传入/传出,见wri.

    2022年9月2日
  • C语言switch语句的用法详解_c语言switch语句例题

    C语言switch语句的用法详解_c语言switch语句例题C语言虽然没有限制ifelse能够处理的分支数量,但当分支过多时,用ifelse处理会不太方便,而且容易出现ifelse配对出错的情况。例如,输入一个整数,输出该整数对应的星期几的英文表示:#includeintmain(){inta;printf(“Inputintegernumber:”);scanf(“%d”,&a);if(a==1){printf(“Mo…

    2022年8月30日
  • mysql的存储过程和存储函数的区别_创建存储过程的语法

    mysql的存储过程和存储函数的区别_创建存储过程的语法oracle与mysql存储过程语法区别mysql、oracle存储过程语法区别1、条件语句:mysql使用elseif关键字,oracle是elsif关键字;oracle:if表达式then表达式;elsif表达式;endif;mysql:if表达式then表达式;elseif表达式;endif;2、字符串连接oracle使用||;mysql使用c…

    2022年9月14日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号