ES5中的块范围

时间:2019-05-20 20:05:17

标签: javascript scope ecmascript-5 iife

我的作业有问题。这是作业:

  

具有以下功能。

let rechne = function(x,y,operation) {
  let ergebnis = x - y;
  if (!operation) {
    let ergebnis = x + y;
    console.log(ergebnis);
  }
  return ergebnis;
}
  

重写函数,以便变量的所需块范围   可以在ES5中实现。

所以我写了这个:

 let rechneScope = function(x,y,operation) {
   (function(){
     let ergebnis = x - y;
   })()

   if (!operation) {
     (function(){
       let ergebnis = x + y;
       console.log(ergebnis);
     })()
   }

   return ergebnis;
}

假定我在console.log中调用了该函数,例如console.log(rechneScope(10, 2)) 我希望第一个变量为8,第二个变量为12。

但是当我重新加载浏览器时,控制台始终为第二个变量打印12,而对于第一个变量,结果却有所不同。有时2,有时8,有时15。我真的很困惑。为什么会这样呢?

2 个答案:

答案 0 :(得分:2)

首先,您假设所需的输出为8,然后12是错误的。第一个执行的console.log是带有ergebnis = x + y的那个,因此您应该看到12然后是8

接下来,ES6中引入了let,因此,如果您限制自己使用ES5,则只能使用var

最后,请确保将每个变量的整个范围包装在IIFE中。您在第一个函数之外有return ergebnis,以便在执行代码行时该变量不再在范围内。

正确的实现应如下所示:

var rechneScope = function(x, y, operation) {
  return (function() {
    var ergebnis = x - y;
    if (!operation) {
      (function() {
        var ergebnis = x + y;
        console.log(ergebnis);
      })()
    }
    return ergebnis;
  })()
}

console.log(rechneScope(10, 2))

我知道这不是您分配的内容,只是作为参考,Babel不会尝试模拟ES6范围。这是Babel编译相同内容的方法:

"use strict";

var rechne = function rechne(x, y, operation) {
  var ergebnis = x - y;

  if (!operation) {
    var _ergebnis = x + y;

    console.log(_ergebnis);
  }

  return ergebnis;
};

答案 1 :(得分:0)

您犯了小错误。

  1. 您正在使用let关键字,它关心范围和 因此,您的“ ergebnis”是未定义的。
  2. 您不在第一块中打印输出。

解决方案是删除return语句并在每个块中打印答案。您会得到理想的结果

Copy()