首页 > 代码库 > 函数申明和函数表达式

函数申明和函数表达式

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

函数申明和函数表达式