zoukankan      html  css  js  c++  java
  • js 自函数

    函数基本概念:

    函数声明:function box(){}

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

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

        匿名函数的作用:如果将匿名函数赋值给一个变量,则声明了一个函数: var box= function(){};

                如果将匿名函数赋予一个事件则成为事件处理程序: box.addEventListener("click",function(){alert("aaa")});

                创建闭包:(function(){})()

    函数定义的三种方法:

      var box = function(){};

      function box(){}

      var box = new Function();

    函数声明和函数表达式的不同:

      js在进行预解析时函数声明会提升,而函数表达式必须js顺序执行到此函数代码时才会逐行解析

      函数表达式后面加括号可以立即执行函数,函数声明不可以,只能以fnName()的方式调用才行

      实例:

    1
    2
    3
    4
    box();
    function box(){
      alert("aaa"); 
    }<br>//正常,因为js在解析阶段函数声明会被提升到最前面,所以函数声明可以在函数执行后面<br>//实际顺序<br>//function box(){<br>  alert("aaa");<br>}<br>//box();<br><br>box();<br>var box = function(){<br>  alert("aaa");<br>}<br>//报错,实际上的顺序是<br>//var box = undefined;<br>//box();<br>//box = function(){<br>  alert("aaa");<br>}<br>//所以当执行到box()时,此时box不是一个函数<br><br>var box = function(){<br>  alert("aaa");<br>}()<br>//正确 函数表达式后面加括号,当执行到后面的括号时js会自动执行此函数<br><br>function box(){<br>  alert("aaa");<br>}()<br>//不会报错,但是只会解析函数声明,忽略后面的括号,不会自执行<br><br>function(){<br>  alert("aaa")<br>}()<br>//语法错误<br>//虽然匿名函数属于函数表达式,但未进行赋值给一个变量<br>//当js解析到function时,将其看成函数声明,报错,需要一个函数函数名

     函数自执行

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    (function(a){
      alert(a); 
    })("123")
     
    //"123" 使用()运算符
     
    (function(a){
      alert(a); 
    }("123"))
     
    //"123" 使用()运算符
     
    !function(a){
      alert(a);
    }("123")
    //"123" 使用!运算符<br><br>+function(a){<br>  alert(a);<br>}("123")<br>//"123" 使用+运算符<br><br>-function (a){<br>  alert(a);<br>}("123")<br>//"123" 使用-运算符<br><br>var fn= function(a){<br>  alert(a);<br>}("123")<br>//"123" 使用=运算符

      在function前面加!、+、-、=都可以将函数声明转化为函数表达式,消除了js引擎识别函数声明和函数表达式的歧义,

    加()是最安全的方法,免得其他的和函数返回值进行运算

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

    javascript中没用私有作用域的概念,如果在多人开发的项目上,你在全局或局部作用域中声明了一些变量,可能会被其他人不小心用同名的变量给覆盖掉,

    根据javascript函数作用域链的特性,可以使用这种技术可以模仿一个私有作用域,用匿名函数作为一个“容器”,

    “容器”内部可以访问外部的变量,而外部环境不能访问“容器”内部的变量,

    所以( function(){…} )()内部定义的变量不会和外部的变量发生冲突,俗称“匿名包裹器”或“命名空间”。

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

  • 相关阅读:
    查看端口有没有被占用
    微信公众号2()
    How to insert a segment of noise to music file
    puppet practice
    Docker Commands
    LempelZiv algorithm realization
    The algorithm of entropy realization
    Java network programmingguessing game
    Deploy Openstack with RDO and Change VNC console to Spice
    puppet overview
  • 原文地址:https://www.cnblogs.com/yelongsan/p/7541430.html
Copyright © 2011-2022 走看看