【问题标题】:Javascript: passing a not defined variable to a functionJavascript:将未定义的变量传递给函数
【发布时间】:2015-02-19 16:11:04
【问题描述】:

我有一些对 AJAX 的调用,我在其中返回一个 JSON 对象作为响应。此 JSON 对象始终具有相同的结构。但是,有时如果 PHP 脚本失败,则 JSON 结构的某些对象未定义甚至不存在。

这也发生在页面中存在的一些“全局”变量中,我在一些 JS 文件中使用,但随后转到另一个页面,我使用这些 JS 文件并且甚至没有写入变量。

所以,我想创建一个函数is_defined(),我可以询问是否定义了变量。函数如下:

function is_defined(ob, can_empty){
    if(can_empty === undefined || can_empty == '') can_empty = false

    return ob !== undefined && ob !== null && (ob !== '' || can_empty)
}

所以,如果传递的变量是NULLundefined,或者是空的(不能为空),我返回false

我的问题出现在甚至没有写入变量时,因为我无法将它传递给函数,因为引发了 Uncaught ReferenceError: obj is not defined error

所以我的问题是是否有任何方法可以创建一个函数来检查变量是否存在并且是否已定义,因为我想集中所有这些检查进入一个函数,而不是时不时地在我的代码上写obj !== undefined || obj !== null

我认为使用双非运算符 (!!!obj) 会强制转换为 false,但如果不写入变量,我将面临同样的问题。

编辑: 就像声明一样,这里的问题是能够检查函数内部未声明和未定义的变量,因此我可以将变量传递给函数,而无需在调用它之前检查它是否声明了变量。

感谢大家的时间和回答!

亲切的问候!

【问题讨论】:

    标签: javascript function variables undefined


    【解决方案1】:

    [...] 有什么方法可以创建一个函数来检查变量是否存在并被定义[...]

    不,没有。当您将变量传递给函数时,它总是会尝试解析该变量。如果没有声明它会抛出一个引用错误。

    Relevant section from the ECMAScript specification.

    您必须检查变量是否通过typeof 声明您将它传递给函数。

    【讨论】:

    • 嗨!感谢您的回答!所以,似乎没有办法做我想做的事……可惜……非常感谢您的宝贵时间!
    【解决方案2】:

    您可以使用typeof variableName === 'undefined' 来测试变量是否已声明。

    具体来说:

    • typeof variable === 'undefined' 测试变量是否被声明。
    • variable === undefined 测试声明的变量是否已定义或赋值。

    【讨论】:

    • typeof 不带参数。这是如何正确的?顺便说一句,它在 c# 中实现
    • @MohitBhasi:(...)分组运算符。就像您可以使用 !(x) 而不是 !x 一样。这有点不寻常,但没有错。
    • @MohitBhasi 是的,typeof 是运算符而不是函数,但正如 Felix 指出的那样,(...) 不仅仅用于函数调用。
    • 您好!感谢您的回答!尽管您能够检查是否以这种方式声明变量是正确的,但应该在将变量传递给函数之前完成。因此,尽管它比检查 undefined 和 null 要好,但我仍然必须在每次检查代码时编写这段代码。这就是我的目标:能够将所有检查集中到一个独特的功能中,并且使用这个解决方案我遇到了同样的问题。还是谢谢!
    • @Adracat 我已经更新了检查 typeof ob === 'undefined' 的答案。这会解决您拥有集中功能的目的吗?
    【解决方案3】:

    检查现有变量的万无一失的方法:

    typeof variableName === 'undefined'

    【讨论】:

    • 您好!感谢您的回答,但正如我在 Anurag Peshne 的回答中指出的那样,我仍然有同样的问题:我必须在调用函数“is_defined()”之前检查它。所以,我仍然必须通过我的所有代码来编写它。感谢您的宝贵时间!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-21
    • 1970-01-01
    • 2015-05-02
    • 2017-04-30
    • 2018-12-14
    • 2014-10-31
    相关资源
    最近更新 更多