0

我有以下代码:

"use strict";

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

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

isTrue = true;

有人可以向我解释为什么当我删除关键字'var'时会抛出异常,但是当它在那里时,它会像未定义一样对待它?

4

1 回答 1

3

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

在严格模式下引用MDN 页面

首先,严格模式不可能意外创建全局变量。在正常的 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;
}
于 2012-04-01T09:39:06.273 回答