繁体   English   中英

有关var声明的JavaScript行为说明

[英]JavaScript behavior explanation regarding a var declaration

我有以下代码:

"use strict";

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

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

isTrue = true;

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

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

MDN页面上以严格模式引用:

首先,严格模式使得不可能意外创建全局变量。 在普通的JavaScript中,迷惑分配中的变量会在全局对象上创建一个新属性,并继续“起作用”(尽管将来可能会失败:在现代JavaScript中可能)。 会意外创建全局变量的赋值会改为以严格模式抛出:

您的关于undefined的问题部分要复杂一些。 由于变量提升,编译器将变量声明提升到声明的作用域的顶部,因此带有var语句的代码与此等效:

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

isTrue = true;

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

如果您只想知道变量是否还具有值,则可以执行以下操作:

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

或者,如果您只是想确保它具有尚未初始化的值,则可以执行以下操作:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM