【问题标题】:JavaScript behavior explanation regarding a var declaration关于 var 声明的 JavaScript 行为解释
【发布时间】:2012-04-01 09:35:46
【问题描述】:

我有以下代码:

"use strict";

function isDefined(variable)
{
    return (typeof (window[variable]) === "undefined") ? false : true;
} 

try
{
    isDefined(isTrue);
}
catch (ex)
{
    var isTrue = false;
}

isTrue = true;

有人可以向我解释为什么当我删除关键字“var”时会抛出异常,但当它出现时却将其视为未定义?

【问题讨论】:

  • 您可能需要考虑两件事:return typeof window[variable] !== 'undefined'; 就足够了,isDefined 的有效签名是isDefined(string),这意味着isDefined('isTrue') 可以得到您似乎期望的行为(@987654325 @、window[true]window[false] 没有意义)。

标签: javascript syntax behavior keyword strict


【解决方案1】:

在严格模式下运行时,不允许访问之前未声明的变量。因此,必须先声明isTrue,然后才能访问它。因此,如果您删除它前面的 var 并且没有在其他任何地方声明它,那将是一个错误。

引用MDN page on strict mode:

首先,严格模式不可能意外创建全局 变量。在正常的 JavaScript 中,在赋值中输入错误的变量 在全局对象上创建一个新属性并继续“工作” (尽管未来的失败是可能的:在现代 JavaScript 中很可能)。 会意外创建全局变量的赋值 进入严格模式:

你关于undefined 的问题有点复杂。由于变量提升,编译器将变量声明提升到声明它的范围的顶部,因此带有var 语句的代码等效于:

var isTrue;
try
{
    isDefined(isTrue);
}
catch (ex)
{
    isTrue = false;
}

isTrue = true;

因此,当您调用isDefined(isTrue) 时,isTrue 的值是undefined。它已被声明,但未初始化,因此它的值为undefined。当您没有 var 语句时,在严格模式下对 isTrue 的任何引用都是错误的,因为它尚未被声明。

如果你只是想知道一个变量是否有值,你可以这样做:

if (typeof isTrue != "undefined") {
    // whatever code here when it is defined
}

或者,如果你只是想确保它有一个尚未初始化的值,你可以这样做:

if (typeof isTrue == "undefined") {
    var isTrue = false;
}

【讨论】:

  • "因为变量提升,编译器将变量声明提升到声明它的范围的顶部";这对所有尊重 ECMA5 的浏览器都是如此吗?使用此代码在旧浏览器上会发生什么?
  • @RandallFlagg - 提升一直是 javascript 的一部分 - 它在 ECMA5 中并不新鲜,因此所有浏览器都会进行变量提升。与严格模式的不同之处在于,分配给未声明的变量是错误的,而在旧浏览器中它只是自动创建一个具有该名称的全局变量。
猜你喜欢
  • 2012-04-29
  • 1970-01-01
  • 2017-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-18
  • 1970-01-01
  • 2020-09-20
相关资源
最近更新 更多