如何检查变量是否已声明,尽管未初始化?

时间:2014-03-27 02:11:50

标签: javascript

如何检查是否实际声明了JavaScript变量?

此解决方案在我的情况下不起作用:

JavaScript check if variable exists (is defined/initialized)

示例:

(function(){
    var abc;
    alert(typeof abc === 'undefined') // true
})();

同样:

(function(){
    alert(typeof abc === 'undefined') // true
})();

在这两种情况下都会产生true。我能做到这一点:

(function(){
    var abc;

    var isDefined = false;
    try { isDefined = abc || !abc; }
    catch(e) {}
    alert(isDefined); // true
})();

它有效,但我正在寻找更好的x浏览器。

编辑:我想在一段通过eval运行的动态代码中使用它,并检查某个变量是否存在于本地或全局范围内。

2 个答案:

答案 0 :(得分:1)

这个问题已被多次询问,答案是"你不能"#34; (除了在OP中使用try..catch)。

您可以使用 hasOwnProperty 中的检查对象的属性,但这两者都要求您可以访问要测试的对象。变量属于执行上下文的变量对象(ES 3)或environment record(ES 5),并且它们不可访问,因此您无法检查其属性。

特殊情况是全局对象,因为全局变量(即全局环境记录的属性)是全局对象的属性,因此您可以这样做:

var global = this;
var foo;

// Declared but not initialised
foo in global // true
global.hasOwnProperty('foo'); // true

// Not declared or initialised
bar in global  // error
global.hasOwnProperty('bar'); // true

但是,IE<版本的全局对象不支持 hasOwnProperty 方法。 9.

答案 1 :(得分:1)

您可以使用"use strict"这样检测到这一点:

"use strict";
try {
    myVar = 7;
    console.log("myVar is "+myVar);
} catch(e) {
    console.log("error");
}

运行脚本,它将打印“错误”。然后注释掉“use strict”并再次运行它;它将打印“myVar is 7”。