精华内容
下载资源
问答
  • 自执行匿名函数

    2017-03-28 17:32:00
    自执行匿名函数: 常见格式:(function() { /* code */ })(); 解释:包围函数(function(){})的第一对括号向脚本返回未命名的函数,随后一对空括号立即执行返回的未命名函数,括号内为匿名函数的参数。 作用:...

    自执行匿名函数:

    • 常见格式:(function() { /* code */ })();
    • 解释:包围函数(function(){})的第一对括号向脚本返回未命名的函数,随后一对空括号立即执行返回的未命名函数,括号内为匿名函数的参数。
    • 作用:可以用它创建命名空间,只要把自己所有的代码都写在这个特殊的函数包装内,那么外部就不能访问,除非你允许(变量前加上window,这样该函数或变量就成为全局)。各JavaScript库的代码也基本是这种组织形式。

    总结一下,执行函数的作用主要为 匿名自动执行,代码在被解释时就已经在运行了。

    其他写法

    (function () { /* code */ } ()); 
    !function () { /* code */ } ();
    ~function () { /* code */ } ();
    -function () { /* code */ } ();
    +function () { /* code */ } ();

    推荐阅读:立即调用的函数表达式  http://www.cnblogs.com/TomXu/archive/2011/12/31/2289423.html

    转载于:https://www.cnblogs.com/chen13560553200/p/6635939.html

    展开全文
  • 匿名函数、自执行函数,自执行匿名函数和立即执行的函数表达式区别 今天在写代码的时候发现对自执行函数有点懵,便去查询资料。然后紧接着自执行匿名函数,立即执行函数,匿名函数一窝蜂的出来了,借此就好好谈谈这...

    匿名函数、自执行函数,自执行匿名函数和立即执行的函数表达式区别

    今天在写代码的时候发现对自执行函数有点懵,便去查询资料。然后紧接着自执行匿名函数,立即执行函数,匿名函数一窝蜂的出来了,借此就好好谈谈这几个函数的区别吧。

    匿名函数

    匿名函数比较好理解,顾名思义就是没有名字的函数

    //普通函数:此函数声明了一个名为a的函数。 
    function a(){
      return 1;  
    };
    //匿名函数:这时你会发现报错了
    function(){
    	 return 1;
    };
    

    这时你会发现单独运行一个匿名函数,由于不符合语法要求,会报错。解决方法:只需要用()把匿名函数包起来即可

    (function(){
    	 return 1;
    };)
    

    自执行函数,立即执行的函数

    在介绍这里之前,我们先聊一聊"自执行"这个说法,关于”自执行“每个人理解不一样,有人称他为:自动执行,也有称作:立即调用,在这里我比较认同另一种说法:立即调用的函数表达式。

    什么是自执行?

    我们创建了一个匿名的函数,并立即执行它,由于外部无法引用它内部的变量,因此在执行完后很快就会被释放,关键是这种机制不会污染全局对象。
    自执行函数,即定义和调用合为一体。

    //对于函数表达式,在后面加括号即可以让函数立即执行;例如下面这个函数,至于为什么加了括
    号就可以立即执行,我们可以这么理解,就是像f();这样写的话,函数 可以立即执行是没问题的
    ,我们在经常会用到,那么对于函数表达式来说,fn1就是对后面的匿名函数的一个引用,因此在
    后面的匿名函数后直接加括号,自然也就可以立即执行
        var f = function(){
            console.log("ss");
        }();
    

    自执行函数的其他几种写法

    我个人推荐第一种写法,好处是,能提醒阅读代码的人,这段代码是一个整体。

    //方法1:最前最后加括号
    (function(){
    	alert(1);
    }());
    
    //方法2:function外面加括号
    (function(){
    	alert(1);
    })();
    
    方法3:function前面加运算符,常见的是!与void 。
    !function(){
    	alert(1);
    }();
    void function(){
    	alert(2);
    }();
    
    

    在参考了多个网站总算将这些理念弄清楚一些。
    参考网址:
    http://www.cnblogs.com/TomXu/archive/2011/12/31/2289423.html
    https://www.cnblogs.com/jessiespur/p/9283101.html
    https://www.jianshu.com/p/1d52ed86d52c

    展开全文
  • javascript中的自执行匿名函数可以用它创建命名空间,只要把自己所有的代码都写在这个特殊的函数包装内,那么外部就不能访问,除非你允许
  • 下面小编就为大家带来一篇深入理解Javascript中的自执行匿名函数。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 自执行匿名函数剖析

    2017-04-30 16:51:34
    引入 在很多js代码中我们常常...这种写法我们称之为自执行匿名函数(self-executing anonymous function)。 正如它的名字一样,它是自己执行自己的,前一个括号是一个匿名函数,后一个括号代表立即执行。  

    引入

    在很多js代码中我们常常会看见这样一种写法:

    (function( window, undefined ) {
        // code
    })(window);

    这种写法我们称之为自执行匿名函数(self-executing anonymous function)。

    正如它的名字一样,它是自己执行自己的,前一个括号是一个匿名函数,后一个括号代表立即执行。

     

     


     

    函数和函数表达式的区别

    • 语法
    复制代码
    function keqing(){   //函数
        alert('Hi~');  
    }
    
    var keqing = function(){  //函数表达式
      alert('Hi~')
    }
    复制代码
    • 函数的函数声明有一个重要特征 —— 函数声明提升 
    复制代码
    keqing();   //Hi~
    function keqing(){   
      alert('Hi~');
    }
    
    函数:在读取执行代码之前会先读取函数声明
    复制代码

     

    复制代码
    keqing();  // Uncaught TypeError: keqing is not a function
    var keqing = function(){
      alert('Hi~');
    }
    
    函数表达式:没有函数声明提升,在执行前必须先赋值
    复制代码
    • 回到我们的自执行匿名函数
    复制代码
    function(){
       alert('aaaa');  
    }()  //出错,因为这是一个匿名函数,函数后不能跟圆括号
    
    
    ---------------> 函数声明想要变成函数表达式,就需要给它加一个圆括号
    
    (function(){
      alert('aaaa');
    })() // aaaa  这样就变成了自执行匿名函数
    
    
    复制代码

     

     


     

    自执行匿名函数剖析

    回到我们最开始的栗子,

    (function( window, undefined ) {
        // code
    })(window);

     

    1.自执行匿名函数写法的好处:防止变量名冲突

    2.自执行匿名函数的其他多种写法:

    复制代码
    ( function() {}() );
    ( function() {} )();
    [ function() {}() ];
    
    ~ function() {}();
    ! function() {}();
    + function() {}();
    - function() {}();
    
    var f = function() {}();
    
    //当然不需要都记住,会用就OK。还有很多不常见的我就不一一举例了..
    复制代码

    3.为何要传入window?

    这样传入window可将其从全局变量变为局部变量,在函数作用域内可以直接访问到window,就不用将作用域链退回到顶层作用域了。

    在压缩代码时,可以对window进行优化。

    4.为何要增加参数undefined?

    由于undefined在一些情况下有可能会被重写,为确保在自执行匿名函数里的undefined是"真的undefined",就需要增加参数undefined。

    展开全文
  • 匿名函数就是没有函数名的函数。这篇文章主要介绍了Javascript自执行匿名函数(function() { })()的原理浅析的相关资料,需要的朋友可以参考下
  • 自执行匿名函数(Self-executing anonymous function)和立即执行的函数表达式(Immediately-Invoked Function Expressio)区别 // 这是一个自执行的函数,函数内部执行自身,递归function foo() { foo(); }// 这...

    自执行匿名函数Self-executing anonymous function和立即执行的函数表达式Immediately-Invoked Function Expressio区别

    // 这是一个自执行的函数,函数内部执行自身,递归
    function foo() { foo(); }
    // 这是一个自执行的匿名函数,因为没有标示名称
    // 必须使用arguments.callee属性来执行自己
    var foo = function () { arguments.callee(); };
    arguments.callee{

    在函数内部,有两个特殊的对象:arguments 和 this。其中, arguments 的主要用途是保存函数参数, 但这个对象还有一个名叫 callee 的属性,该属性是一个指针,指向拥有这个 arguments  对象的函数。

    function foo(num){    

       if (num <=1) {         

          return 1;     

       } else {         

       return num * foo(num-1)     

       }

    }

    定义阶乘函数一般都要用到递归算法;如上面的代码所示,在函数有名字,而且名字以后也不会变的情况下,这样定义没有问题。但问题是这个函数的执行与函数名 foo紧紧耦合在了一起。为了消除这种紧密耦合的现象,可以像下面这样使用 arguments.callee

    function foo(num){    

       if (num <=1) {         

          return 1;     

       } else {         

       return num * arguments.callee(num-1);

       }

    }  

    现在已经不推荐使用arguments.callee();原因访问 arguments 是个很昂贵的操作,因 为它是个很大的对象,每次递归调用时都需要重新创建。影响现代浏览器的性能,还会影响闭包。 

    }


    // 这可能也是一个自执行的匿名函数,仅仅是foo标示名称引用它自身
    // 如果你将foo改变成其它的,你将得到一个used-to-self-execute匿名函数
    var foo = function () { foo(); };

    // 有些人叫这个是自执行的匿名函数(即便它不是),因为它没有调用自身,它只是立即执行而已。
    (function () { /* code */ } ());

    // 为函数表达式添加一个标示名称,可以方便Debug
    // 但一定命名了,这个函数就不再是匿名的了
    (function foo() { /* code */ } ());

    // 立即调用的函数表达式 也可以自执行,不过可能不常用罢了
    (function () { arguments.callee(); } ());
    (function foo() { foo(); } ());

     

    问题的核心

    当你声明类似function foo(){}或var foo = function(){}函数的时候,通过在后面加个括弧就可以实现自执行,例如foo(),看代码:

    // 因为想下面第一个声明的function可以在后面加一个括弧()就可以自己执行了,比如foo(),
    // 因为foo仅仅是function() { /* code */ }这个表达式的一个引用 
    var foo = function(){ /* code */ }
    // ...是不是意味着后面加个括弧都可以自动执行?// SyntaxError: Unexpected token 
    function(){ /* code */ }();

    上述代码,如果甚至运行,第2个代码会出错,因为在解析器解析全局的function或者function内部function关键字的时候,默认是认为function声明,而不是function表达式,如果你不显示告诉编译器,它默认会声明成一个缺少名字的function,并且抛出一个语法错误信息,因为function声明需要一个名字

    有趣的是,即便你为上面那个错误的代码加上一个名字,他也会提示语法错误,只不过和上面的原因不一样。在一个表达式后面加上括号(),该表达式会立即执行,但是在一个语句后面加上括号(),是完全不一样的意思,他的只是分组操作符。

    // 下面这个function在语法上是没问题的,但是依然只是一个语句
    // 加上括号()以后依然会报错,因为分组操作符需要包含表达式
     function foo(){ /* code */ }(); // SyntaxError: Unexpected token )
     // 但是如果你在括弧()里传入一个表达式,将不会有异常抛出
    // 但是foo函数依然不会执行
    function foo(){ /* code */ }( 1 );
     // 因为它完全等价于下面这个代码,一个function声明后面,又声明了一个毫无关系的表达式:
    function foo(){ /* code */ }
    ( 1 );

    展开全文
  • IIFE(立即调用函数表达式,自执行匿名函数) IIFE(Imdiately Invoked Function Expression 立即执行的函数表达式)顾名思义声明立即调用执行这个函数,立即调用的函数表达式可用于避免块内的变量提升,防止污染...
  • 问题:我一直以来对自执行匿名函数就不是太理解尤其对其写法(function(){})()感觉很困惑。现在对这种写法,为什么这样写有了一个相对清晰的认识。 大家想看一个代码: 1 <!DOCTYPE html> 2 <...
  • 要理解匿名函数,首先需要理解函数也是一种类型。 所以函数可以赋值给变量,如下: // 将数字类型值赋给变量 var num = 1; // 将函数类型值赋给变量 var hello = function () { console.log("hello world"); ...
  • avascript中的自执行匿名函数

    千次阅读 2014-09-15 00:36:42
    不可不知的avascript中的自执行匿名函数和使用技巧
  • 1.基础概念:定义函数的方式一般定义函数有两种...关于函数声明,它最重要的一个特征就是函数声明提升,意思是执行代码之前先读取函数声明。这意味着可以把函数声明放在调用它的语句之后。如下代码可以正确执行:...
  • 1.自执行匿名函数写法的好处:防止变量名冲突 2.自执行匿名函数的其他多种写法: ~ function() {}(); ! function() {}(); + function() {}();- function() {}();3.为何要传入window? 这样传入window
  • JS自执行匿名函数

    2019-07-02 22:19:54
    解释:包围函数(function(){})的第一对括号向脚本返回未命名的函数,随后一对空括号立即执行返回的未命名函数,括号内为匿名函数的参数。 作用:可以用它创建命名空间,只要把自己所有的代码都写在这个特殊的函数...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,789
精华内容 715
关键字:

自执行匿名函数