zoukankan      html  css  js  c++  java
  • 函数申明和函数表达式

    1.js解析器会优先读取函数申明,即使函数调用在申明之前,

       aaa();
      //函数申明
        function aaa(){
            alert(1);    // 1
        }

    而函数表达式必须等到执行到它所在的代码行时,才会被解释执行,如果提前调用,则会报错,

    bbb();
      //函数表达式
        var bbb = function(){
            alert(2);   // TypeError: bbb is not a function
        }

    2.当函数申明的函数名与变量重复时(不推荐这样的做法),会优先解析函数申明,

    function a(){
            var ccc;
            alert(typeof ccc);  //function
            function ccc(){
                
            }
        }
        a();

    3.(function(){})()——这种形式也是函数表达式。

    4.具名函数表达式,也叫作自执行函数:比如

    var ddd = function sum(){}

    此时,只能通过ddd()来执行函数,外部不能调用sum()来执行,函数内部则可以访问到sum(),

    var ddd = function sum(){
            console.log('内部的sum是'+typeof sum);  //内部的sum是function
        }
        console.log('外部的sum是'+typeof sum);   //外部的sum是undefined
        ddd();

    5.对象内部的函数表达式,在函数表达式内部能不能访问存放当前函数的变量。

    var o = {
            aaa:function(){
                console.log(aaa);
            }
        }
        o.aaa();  //ReferenceError: aaa is not defined

    有一个例子:

    function fn(){                    ①
            return {
                fn:function(){        ②
                    return fn();      ③
                };
            }
        }

    ①fn执行的时候,返回了一个对象,假设接着又调用了这个对象中的fn②,返回的fn③其实就是fn①,因为刚才上面的例子说了,对象内的函数表达式的内部fn③无法访问到fn②。

    function fn(a, b){ 
            console.log(b);              
            return {
                fn:function(c){        
                    return fn(c, a);      
                }
            }
        }
    
        var one = fn(1);   //undefined
        var two = one.fn(0);  // 1

    第5条是受到《大部分人都会做错的经典JS闭包面试题》中启发。

  • 相关阅读:
    入职一家新公司
    简单的线性数据比较
    python编程导论读书笔记【4】终章
    Hadoop构建数据仓库实践读书笔记【3】__数据仓库设计基础
    清北最后冲刺 张浩威 吃鱼
    新汉诺塔
    小朋友的数字
    硬币购物
    HH的项链
    求逆序对 && 逆序对数列
  • 原文地址:https://www.cnblogs.com/hcy1996/p/5903929.html
Copyright © 2011-2022 走看看