【问题标题】:why are functions in the form of var name = function(){...} not being hoisted in ES5?为什么 var name = function(){...} 形式的函数没有在 ES5 中被提升?
【发布时间】:2017-01-10 14:55:52
【问题描述】:

以下 sn-p 代码抛出 ReferenceError: selectTen is not defined

    var select = _.pipe(
      selectTen,
      fetchUrls,
      awaitUrlData,
      connectToLoad
    )

    var selectTen = _.partialRight(selectItems, [4]) 
    var connectToLoad = _.partialRight(connect, [load]);  

虽然以下 sn-p 运行良好:

   var selectTen = _.partialRight(selectItems, [4]) 
   var connectToLoad = _.partialRight(connect, [load]);  

    var select = _.pipe(
      selectTen,
      fetchUrls,
      awaitUrlData,
      connectToLoad
    )

我正在使用 vanilla (ES5) JavaScript 作为 angularjs 项目的一部分运行此代码,其中 .js 文件包含在 index.html 的标签中。没有使用模块加载器

_. 表示法是 lodash 函数式编程库的一部分。可以说它们返回函数并且可以替换为function(param){...}

为什么第一个 sn-p 中没有托管 selectTen 和 connectToLoad 函数?

【问题讨论】:

  • @SurenSrapyan 我看不出这个问题与您标记的问题之间的相关性。
  • 为什么要提升作业? const 不是 ES5 的一部分。
  • ... vanilla (ES5) JavaScript — 但 ES5 没有 const 声明?
  • @zeroflagL 哇,你说 const 不是 ES5 的一部分其实是对的

标签: javascript angularjs lodash ecmascript-5


【解决方案1】:

let 声明一样,const 声明的范围仅限于它们的封闭块,就好像变量(嗯,常量)是在块的顶部声明的。但是,在代码中实际出现声明的位置之前,不能使用该值。

块的开口和声明出现的点之间的间隙被称为(相当戏剧化的)“时间死区”。

【讨论】:

    【解决方案2】:

    因为它们不是已定义的函数,所以它们是具有函数字面值作为其值的常量。

    如果你愿意,例如:

    function selectTen(selectedItems) { return _.partialRight(selectedItems, [4]); }
    

    然后他们会被吊起来

    【讨论】:

    • 这可能有效,但并不能真正回答问题。请参阅@Pointy 的回答。
    猜你喜欢
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-10
    • 1970-01-01
    • 2012-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多