• 对js立即执行函数的理解


    js的匿名函数的常见2种用法  

    1:(function(){})()
    2:(function(){}())

    今天看了一篇博客终于理解了这2种写法,首先要理解2点

    函数声明:function(){}

    函数表达式:var fun=function(){}

    匿名函数:function(){},匿名函数属于函数表达式。

    函数声明和函数表达式的不同:函数表达式后面加上()后可以直接马上执行。函数声明不可以。

    其中重要的一点:

      在函数前面加上+ - ()后就可以将函数声明转化为函数表达式。

    !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)

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

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

    注意:

       这样function(){}()是错的。因为在编译器解析的时候会被当成函数声名但没有名字最后报错。如果需要创建匿名函数,则必须给出一个函数表达式而非函数的显式声明。   匿名函数代码模式只 不过是通过括号或者void告诉编译器,把function(){}当作函数表达式来解释罢了。这其中并没有那么复杂 的优先级和void操作符原理。这只不过是一个简单的语法转换。可以想象,只要符合函数表达式的语法,我们就可以创建出N种匿名函数代码模式

     

    匿名函数在调用了外部变量的时候才是闭包。

    闭包是什么

         简单的说就是函数中的函数,它的实现原理

     每个函数上附加上一个额外的隐藏对象,这个对象其实就叫做闭包对象,它就是个普通的对象! 记录了本函数内部的变量列表而已。而且这个闭包对象还保存了一个指向上级函数的闭包对象的引用。这样一来,就形成了一个链条。当我们在一个函数里访问一个变量的时候,编译器会先看看在本闭包里到底有没有这个变量,如果没有就向上寻找。如果找到,那就用,如果一直找到头也没有,那就提示出错。

  • 相关阅读:
    数据库索引的作用和优势缺点
    Python 新浪微博元素 (Word, Screen Name)词汇多样性
    解决Myeclipse在port占用,导致tomcat无法启动。(Linux)
    linux命名管道通信过程
    Lua环境搭建之使用EditPlus搭建Lua开发环境
    详解LUA开发工具及其环境配置
    UltraEdit配置python和lua环境
    Lua学习笔记
    Linux 安装ibus极点五笔输入法备忘录
    win2k/xp查看当前进程
  • 原文地址:https://www.cnblogs.com/sliuie/p/5113364.html
Copyright © 2020-2023  润新知