javascirpt匿名自执行函数小结

看很多的网站的js文件,要面对的第一函数通常是匿名自执行函数,形如(function(){})(),它的作用有两个,一是匿名,在java中有匿名内部类,作用类似。匿名的意思是没有声名函数的名字,这样就使得函数外部无法访问匿名自执行函数的内部,防止函数之间变量命名的相互干扰,比如说有两个人写了两个js,放在同个网页中,如果它们没有用匿名函数包裹,这两个js文件之间的函数会互相调用,导致错误的产生。

那么如何访问匿名函数里面的函数呢?通常是在里面的函数或变量前加上window,这样该函数或变量就成为全局的了,在同个页面,即使是不同我js文件,也可以访问到,所以只要某个页面中加入jquery.js,那么其它js文件就可以用jquery(*)来访问jquery.js中的函数。

匿名自执行函数的另外一个作用是自执行,其实只要在js文件中写在任何代码,只要不包括function类型,它都会执行,它的作用有点像onload,不过onload是在页面载入完后才执行,它不用,所以如果它要调用某个页面元素,一定要将这个页面元素放在匿名自执行函数之前,否则会产生错误。

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会去对它求解得到返回值, 由于返回值是一 个函数, 故而遇到();时, 便会被执行.

在jquery中,匿名自执行函数中嵌套了匿名自执行函数,形如

 代码如下 复制代码

(function(){

var a=function(){};

(function(){

a()

})();

})();

这样写的目前是实现自调用,匿名自执行函数里的匿名自执行函数可以调用上级的函数。这也有点像java,类内的变量和方法对内部类是透明的。所以a=function中a之前不用加window,我们接着往下看

声明函数的一个方法:

 代码如下 复制代码

var afun = function(){

    alert(1);

};

afun就是一个函数,准确的说是指向一个函数的变量或者指针,而如果没写afun,那么:

 代码如下 复制代码

function(){

    alert(1);

};

就是一个匿名函数,因为没有名字,但是它还确实存在在内存中。没有名字的函数我们没有办法直接调用了,调用一个函数需要函数名加上一对小括号,比如afun()。那匿名函数能做什么呢?虽然没有名字,但是它可以把自己当成变量传给其它函数,比如:

 代码如下 复制代码

var fun = function(afunction){

    if(typeof afunction == "function"){

        afunction();

    }

}

fun(function(){

    alert(1);

});

虽然在定义这个函数时没有名字,但是它传递给fun之后,在fun的函数体内,它是有名字的,名字是afunction。这种用法其实很常见,再比如:

 代码如下 复制代码

dojo.connect("adiv","onclick",function(){

    alert("onclick");

});

匿名函数另一种用法就是自执行。函数名后面加上一对()就是执行这个函数,那么下面这个括号表达式就是定义一个函数,括号表达式的返回值就是这个函数:

 代码如下 复制代码

(function(){

    alert(1);

});

在外面这对括号后再加上(),就是执行括号表达式返回的函数:

 代码如下 复制代码

(function(){

alert(1);

})();

这个就是匿名自执行函数,首先它没有名字,其次,它在定义之后会直接被执行,而且它没法再被执行,因为它没有名字。匿名自执行函数可以传参:

 代码如下 复制代码

(function(i){

alert(i);

})(1);

匿名自执行函数有很多用处,主要是用于封装,比如看jquery或者dojo的源码发现它们都是封装在匿名自执行函数中,这样就可以做到页面加载时自动初始化,而且向外公开它想公开的属性和方法,而用到的临时变量可以安全封闭在匿名函数内。

时间: 2024-09-27 21:38:15

javascirpt匿名自执行函数小结的相关文章

如何定义立即执行函数?【转】

  js 前加感叹号是什么意思?比如 !function(){}(); 答案在这里  2016-05-12 23:25 1773人阅读   分类: Web-H5-CSS3-JS(10)  此文出自 http://q.cnblogs.com/q/52920/ 感谢原创作者和转载者,感谢提问人和解答人. !function(){}();   !有什么用? 从语法上来开,JavaScript中分号表示语句结束,在开头加上,可能是为了压缩的时候和别的方法分割一下,表示一个新的语句开始.所以,如果在一个单

JavaScript中的立即执行函数表达式介绍

 这篇文章主要介绍了JavaScript中的立即执行函数表达式介绍,本文着重讲解了什么是立即调用函数表达式,需要的朋友可以参考下     我们习惯看到这样的匿名函数 代码如下: (function(){ console.log("test"); })(); 之前一直叫的是自执行的匿名函数(self-executing anonymous function)   发现原来还有一种叫法是: 立即调用函数表达式 (IIFE,Immediately-Invoked Function Expre

深入理解javascript中的立即执行函数(function(){…})()_基础知识

javascript和其他编程语言相比比较随意,所以javascript代码中充满各种奇葩的写法,有时雾里看花,当然,能理解各型各色的写法也是对javascript语言特性更进一步的深入理解. ( function(){-} )()和( function (){-} () )是两种javascript立即执行函数的常见写法,最初我以为是一个括号包裹匿名函数,再在后面加个括号调用函数,最后达到函数定义后立即执行的目的,后来发现加括号的原因并非如此.要理解立即执行函数,需要先理解一些函数的基本概念.

深入浅析javascript立即执行函数_javascript技巧

javascript和其他编程语言相比比较随意,所以javascript代码中充满各种奇葩的写法,有时雾里看花; 当然,能理解各型各色的写法也是对javascript语言特性更进一步的深入理解.  JavaScript 函数语法 函数就是包裹在花括号中的代码块,前面使用了关键词 function: function functionname() { 这里是要执行的代码 } 当调用该函数时,会执行函数内的代码. 可以在某事件发生时直接调用函数(比如当用户点击按钮时),并且可由 JavaScript

《JavaScript应用程序设计》一一2.4 立即执行函数表达式

2.4 立即执行函数表达式 在JavaScript中,我们可以在函数声明后立即将其执行,这个技术曾在社区中被称为"自执行匿名函数",不过冠以这个名称让人们觉得函数能够被递归调用,显然有点不太妥.Ben Alman曾发表了一篇名为"自执行函数表达式"(IIFE)的博文(http://bit.ly/i-ife/),相比之下,人们觉得缩写IIFE显得更为有趣且清晰易懂,现在IEIF一词已经在JavaScript社区中广为使用.IIFE所创建出的临时作用域常常用来作模块封装

深入解析JavaScript中的立即执行函数_基础知识

它是什么在 JavaScript 里,每个函数,当被调用时,都会创建一个新的执行上下文.因为在函数里定义的变量和函数是唯一在内部被访问的变量,而不是在外部被访问的变量,当调用函数时,函数提供的上下文提供了一个非常简单的方法创建私有变量. function makeCounter() { var i = 0; return function(){ console.log(++i); }; } //记住:`counter`和`counter2`都有他们自己的变量 `i` var counter =

javascript自执行函数之伪命名空间封装法_javascript技巧

自执行函数:自动执行的函数.它在被解释时就已经在运行了.一般函数都是在被调用时才会执行的. 自执行函数的一般格式:(function() { 函数体 })(); 而且,自执行函数中一般都会有一个function() {}形式的匿名函数. 下面的代码在window对象中创建一个命名空间 mySpace,并把自执行函数中的方法封装在mySpace命名空间之下,以便于我们调用这个自执行函数中的一些功能. 复制代码 代码如下: (function() { //根据id获取对象 function $(id

JavaScript中的立即执行函数表达式介绍_javascript技巧

我们习惯看到这样的匿名函数 复制代码 代码如下: (function(){     console.log("test"); })(); 之前一直叫的是自执行的匿名函数(self-executing anonymous function) 发现原来还有一种叫法是: 立即调用函数表达式 (IIFE,Immediately-Invoked Function Expression) 立即调用函数表达式 相比于自执行匿名函数,立即调用函数表达式的意思来得更明确一些. 自执行函数有下面的这一些例

JavaScript之闭包问题以及立即执行函数

今天我将会来浅谈一下关于JavaScript的立即执行函数以及闭包问题. 首先我们先要了解一下关于立即执行函数: ( function(){-} )()和( function (){-} () )是两种javascript立即执行函数的常见写法,最初我以为是一个括号包裹匿名函数,再在后面加个括号调用函数,最后达到函数定义后立即执行的目的,后来发现加括号的原因并非如此.要理解立即执行函数,需要先理解一些函数的基本概念. 函数声明.函数表达式.匿名函数 函数声明:function fnName ()