码迷,mamicode.com
首页 > 其他好文 > 详细

函数申明和函数表达式

时间:2016-09-24 20:15:09      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:

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

函数申明和函数表达式

标签:

原文地址:http://www.cnblogs.com/hcy1996/p/5903929.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!