网站搜索

javascript - 访问 if 块中的变量


var func = function () {
   var i: number = 0;
   if (i == 0) {
      var y: number = 1;
   }

   document.body.innerHTML = y.toString(); // js/ts should complain me in this line
};

func(); // output: 1

如您所见,我在 if 块中声明了变量 y。所以,我认为它不能在作用域外被引用。

但是,当我尝试运行代码时,输出是 1。

这是 TypeScript/JavaScript 中的问题吗?

答案#1

JavaScript 中的变量会被提升,这意味着 var y 会被移动到函数的顶部,就好像它在那里被声明一样。

然而,初始化不会被提升,所以如果你将 i 改为除 0 之外的值,变量 y 仍然会存在,但它的值将是 undefined。

这意味着该函数完全等同于:

var func = function () {
   var i: number = 0;
   var y: number;
   if (i == 0) {
       y = 1;
   }

   document.body.innerHTML = y.toString(); // js/ts should complain me in this line
};

要得到你期望的行为,你需要使用 let,它是 ECMAScript 2015(ES6)的一部分。它是块级作用域的,正如你所期望的。它还会有效地工作,使其只能从定义点开始访问,这可能也是你所期望的。

答案#2

如果你重新声明一个 JavaScript 变量,它不会丢失其值。

第二个参考可能为新的变量语法铺平道路。实际上,如果你记得,javascript 中变量声明并不是必要的。简单

y=1;

也可以。

在我看来,当你第二次在 if 块之外引用 y 时,它会尝试重新声明并保留旧值。

参考 - http://www.w3schools.com/js/js_variables.asp & http://www.w3schools.com/js/js_scope.asp