关于var声明的JavaScript行为解释

时间:2012-04-01 09:35:47

标签: javascript syntax behavior keyword strict

我有以下代码:

"use strict";

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

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

isTrue = true;

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

1 个答案:

答案 0 :(得分:3)

在严格模式下运行时,您不允许访问之前未声明的变量。因此,必须先声明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;
}