【问题标题】:How can I implement the following JavaScript closure in strict mode?如何在严格模式下实现以下 JavaScript 闭包?
【发布时间】:2012-07-31 23:55:09
【问题描述】:

以下代码

'use strict';

function blah() {

    if (1 ==21) {
    }
    else {
        var i = 10;
        function inner() {
            console.log(i);
        }
    }
}

产生以下错误:

SyntaxError: 在严格模式代码中,函数只能在 顶级或直接在另一个函数中。

如何编写我的函数内部以便它可以访问我的变量“i”?根据严格模式,我需要将函数移到顶部,但此时'i'尚未声明

【问题讨论】:

  • 该代码(特别是块内的函数声明)在任何版本的 ECMAScript 中都不是严格有效的。它之所以有效,是因为所有主流浏览器都实现了 ECMAScript 扩展来应对这种特殊情况。

标签: javascript closures


【解决方案1】:

内部函数必须声明为函数表达式,如下所示:

var inner = function () {
    console.log(i);
};

【讨论】:

    【解决方案2】:

    inner() 需要从哪里访问?这对您的目的有用吗?:

    var inner = function () { ... };
    

    【讨论】:

      【解决方案3】:

      由于var i 无论如何都会被提升到function blah 范围的顶部,因此您可以这样做:

      'use strict';
      
      function blah() {
          var i;
          function inner() {
              console.log(i);
          }
      
          if (1 ==21) {
          }
          else {
              i = 10;
          }
      }​
      

      【讨论】:

        【解决方案4】:

        它已被声明,因为 var 声明了整个函数的变量,而不是块。

        【讨论】:

        • 是的,但 function 声明不像 var 声明那样工作。
        • @PPvG 这就是存在严格警告的原因。
        猜你喜欢
        • 1970-01-01
        • 2012-07-05
        • 2015-11-07
        • 1970-01-01
        • 2013-07-31
        • 1970-01-01
        • 2017-01-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多