为了账号安全,请及时绑定邮箱和手机立即绑定

JS函数声明和函数表达式的区别

JS函数声明和函数表达式的区别

交互式爱情 2019-06-06 10:06:38
JS函数声明和函数表达式的区别
查看完整描述

3 回答

?
慕哥9229398

TA贡献1877条经验 获得超6个赞

var init = function() { }; 是函数表达式,函数在代码执行的到当前行的时候才被执行,init 才被赋值。

function init() {} 是函数的声明,和 var 一样,会被提前到代码最前面定义。

所以,下面的两个例子:

 

1

2

3

4

5

6

7

foo(); // 在函数声明之后调用 foo,可以正常调用。因为 foo 被提前到最前面定义了。

 

function foo() {

 

    return true;

 

}

   

1

2

3

4

5

6

7

foo(); // 在函数表达式之前调用函数,报错。因为这时候还没有 foo 这个变量。

 

var foo = function() {

 

    return foo;

 

};

   

ES5 规定,函数只能在顶级作用域和函数作用域中声明,否则是不合法的。例如:

   

1

2

3

4

5

6

7

8

9

10

11

if( true ) {

 

    // 非顶级和函数作用域内定义函数,是错误的,虽然可能浏览器不一定会抛出错误,但是是不规范的。

 

    function foo() {

     

        return true;

     

    }

 

}

   

 

ES6 引入了块级作用域的概念,这种定义方法就被允许了。在块级作用域里面声明的函数,作用域类似于使用 let 声明的变量,在块级作用域之外没有办法被调用。

例如:

   

1

2

3

4

5

6

7

8

9

10

11

{

     

    function foo() {

     

        return true;

     

    }

 

}

 

foo(); // 在函数声明的代码块之外调用函数,会抛出错误。



查看完整回答
反对 回复 2019-06-08
?
繁花如伊

TA贡献2012条经验 获得超12个赞

javascript虽然是解释执行的语言,但也会进行预编译。
if(condition){
function sayHi(){
alert("Hi!");
}
}else{
function sayHi(){
alert("Yo!");
}
}
这种形式,JS引擎在预编译的过程中会注册方法到window对象下,就是window.sayHi。
而不会顾及if else条件,导致重复的sayHi方法被注册,在这种情况下是无效语法。var sayHi;
if(condition){
sayHi=function sayHi(){
alert("Hi!");
};
}else{
sayHi=function sayHi(){
alert("Yo!");
};
}
而下面这种是作为一个 变量(而非函数function),变量是可以被重复赋值的,所以语法不会有问题。



查看完整回答
反对 回复 2019-06-08
  • 3 回答
  • 0 关注
  • 542 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信