• 函数申明和函数表达式


    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闭包面试题》中启发。

  • 相关阅读:
    加密算法整理
    NSURLConnection类说明
    ios5 中文键盘高度变高覆盖现有ui问题的解决方案(获取键盘高度的方法)
    "ld: library not found for l...." 问题的解决
    ios5 自定义导航条问题
    objectivec 语言知识点
    JSON
    [转]XCode中修改缺省公司名称/开发人员名称
    [转]iPhone开源项目汇总
    清除SQL 数据库日志 欧阳锋
  • 原文地址:https://www.cnblogs.com/hcy1996/p/5903929.html
Copyright © 2020-2023  润新知