函数申明和函数表达式

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

posted @ 2016-09-24 19:36  小_前端  阅读(214)  评论(0编辑  收藏  举报