前端面试-函数声明和函数表达式的区别

函数声明(Function Declaration)

// 函数声明
funDeclaration("Declaration"); //=> true
function funDeclaration(type){
    return type==="Declaration";
}

函数表达式(Function Expression)

// 函数表达式
funExpression("Expression");//=>error
var funExpression = function(type){
    return type==="Expression";
}

用函数声明创建的函数“funDeclaration”可以在“funDeclaration”定义之前就进行调用;而用函数表达式创建的“funExpression”函数不能在“funExpression”被赋值之前进行调用。

JS Function两种类型的区别:

用函数声明创建的函数可以在函数解析后调用(解析时进行等逻辑处理);而用函数表达式创建的函数是在运行时进行赋值,且要等到表达式赋值完成后才能调用。

本质原因体现在这两种类型在Javascript function hoisting(函数提升)和运行时机(解析时/运行时)上的差异。

测试题

var sayHello;
console.log(typeof (sayHey));//=>undefined    
console.log(typeof (sayHo));//=>undefined
    if (true) {
        function sayHey() {
            console.log("sayHey");
        }
        sayHello = function sayHo() {
            console.log("sayHello");
        }
    } else {
        function sayHey() {
            console.log("sayHey2");
        }
        sayHello = function sayHo() {
            console.log("sayHello2");
        }
    }    
    sayHey();// => sayHey   
    sayHello();// => sayHello

在花括号里面声明的函数在进行预解析时只会提升函数名,不会提升函数体,所以不管if条件是否为真,函数体都不会提升,永远是undefined。


本文由 w3cmark_前端笔记 版权所有,转载时请注明出处。
注明出处格式:w3cmark (http://www.w3cmark.com/2017/572.html)

分享到:

关注w3cmark
微信公众号 w3cmark_com