zoukankan      html  css  js  c++  java
  • (function(){})()原理

    真的是越学发现会的越少,从学ES6箭头函数看到this指向, 了解this指向发现(function(){})()这个也不会,好在有人在网上给出了答案, 
    
    你需要明白 IIFE 的原理,我简单说一下:
    
    function foo() {...}     // 这是定义,Declaration;定义只是让解释器知道其存在,但是不会运行。
     
    foo();                   // 这是语句,Statement;解释器遇到语句是会运行它的。
    IIFE 并非必须,传统一点可以这么写:
    
    function foo() {...}
    foo();
    那么为什么要 IIFE?
    
    传统的方法啰嗦,定义和执行分开写;
    
    传统的方法直接污染全局命名空间(浏览器里的 global 对象,如 window)
    
    于是,开发者们想找一个可以解决以上问题的写法。那么像下面这么写行不行呢?
    
    function foo(...){}();
    当然是不能,但是为什么呢?因为 function foo(...){} 这个部分只是一个声明,对于解释器来说,就好像你写了一个字符串 "function foo(...){}",它需要使用解析函数,比如 eval() 来执行它才可以。所以把 () 直接放在声明后面是不会执行,这是错误的语法。
    
    如何把它变得正确?说起来也简单,只要把 声明 变成 表达式(Expression) 就可以了。
    
    实际上转变表达式的办法还是很多的,最常见的办法是把函数声明用一对 () 包裹起来,于是就变成了:
    
    (function foo() {...})    // 这里是故意换行,实际上可以和下面的括号连起来
    ();
    这就等价于:
    
    var foo = function () {...};    // 这就不是定义,而是表达式了。
    foo();
    但是之前我们说不行的那个写法,其实也可以直接用括号包起来,这也是一种等价的表达式:
    
    (function foo(){...}());
    所以你问有没有区别?很简单:木有~
    
    另外,刚才说过转变表达式的方式很多,的确还有很多别的写法,比如:
    
    !function foo() {...}();
    或者
    
    +function foo() {...}();
    这些都可以。
    
    我个人挺偏爱用 void 来转变表达式,因为此关键字不会有返回值。不过这一点真的没有什么要紧的,就当我“龟毛”好了……
    
    void function () {
        // 这里是真正需要的代码
    }();
    OK,所谓不去污染全局命名空间,是因为 IIFE 创建了一个新的函数作用域,你真正的业务代码被封装在其中,自然就不会触碰到全局对象了。如果你需要全局对象,那就 pass 给 IIFE:
    
    void function (global) {
        // 在这里,global 就是全局对象了
    }(this)    // 在浏览器里,this 就是 window 对象
    赞一个

    IIFE的函数名和参数
    根据《You Don’t Know JS:Scope & Clouses》[2]的说法,尽量避免使用匿名函数。但是IIFE确实只执行一次,给IIFE起个名字有些画蛇添足了。如果非要给IIFE起个名字,干脆就叫IIFE好了。
    IIFE可以带(多个)参数,比如下面的形式:

    var a = 2;
    (function IIFE(global){
        var a = 3;
        console.log(a); // 3
        console.log(global.a); // 2
    })(window);
    
    console.log(a); // 2

    https://www.cnblogs.com/yiven/p/8462666.html

  • 相关阅读:
    CentOS 6.3 下编译Nginx(笔记整理)
    XMPP协议相关基础概念(Strophe学习笔记)
    StackMapTable format error
    hibernate的子查询
    strophe与openfire模拟的XMPP简单hello程序
    Strophe.Status的所有值
    博客园添加SyntaxHighlighter
    P5395 【模板】第二类斯特林数·行
    test20191001
    test20190829
  • 原文地址:https://www.cnblogs.com/zuochanzi/p/13071224.html
Copyright © 2011-2022 走看看