这两种声明方法的区别是什么

// 函数声明语句
{
  let a = 'secret';
  function f() {
    return a;
  }
}

// 函数表达式
{
  let a = 'secret';
  let f = function () {
    return a;
  };
}
阅读 2.2k
4 个回答

ES6环境下的let变量声明

// 函数声明语句
{
  let a = 'secret';
  function f() {
    return a;
  }
}
f();//secret

在语句块中声明了一个变量a和一个函数f,其中变量a使用了let关键字,说明它是一个局部变量,作用域在其所在的语句块中,而函数f的作用域为全局的,在语句块的外面可以访问。又因为闭包的关系,函数f使用到的变量指向let a。

这个和如下代码是不同的

{
  let a = 'secret';
}

function f() {
    return a;
}
f();//Uncaught ReferenceError: a

对于下面的代码:

// 函数表达式
{
  let a = 'secret';
  let f = function () {
    return a;
  };
}
f();//Uncaught ReferenceError: f

在语句块中声明了变量a和函数f,在语句块的外面不能访问函数变量f

// 函数表达式
{
  let a = 'secret';
  let f = function () {
    return a;
  };
  f()://secret
}

一般函数和函数表达式的区别

  1. 一个是函数声明,一个是表达式

  2. 一个是有名函数,一个是匿名函数

  3. 一个f.name属性是''(空字符串),一个是'f'

我觉得可以直接看MDN的函数表达式吧,简单来讲前者只是静态声明(不运行),后者是运行后将返回值存到变量里。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题