理解函数和未定义

时间:2013-06-23 21:53:38

标签: javascript

来自非JavaScript的背景,我试图围绕'未定义'。 我写了一个“isUndefined”函数如下:

function isUndefined(value) {
    return (typeof value === 'undefined');
}

如果我输入我的源码(变量'boo'不存在),我得到预期结果“未定义变量”。

if (typeof boo === 'undefined') {
    console.log('undefined variable');
}

如果我键入以下内容:     console.log (isUndefined(undefined));

我得到了预期的结果'true'

如果我输入:console.log(isUndefined(boo));

我明白了:

  

参考错误:未定义boo。

我希望得到'true' - 所以我的问题是为什么对undefined的第一次“直接”检查会返回预期结果,但是对它进行函数()测试却没有?

3 个答案:

答案 0 :(得分:7)

恰好包含undefined值的现有变量与根本不存在的变量之间存在差异。如果变量名不存在,则尝试引用变量名是错误的。

typeof运算符是一种特殊情况:即使没有该名称的变量,它也会接受名称。但只有在名称实际使用时才使用 typeof运算符。

在您的函数示例中,您使用的名称不存在,并且在使用名称的位置没有typeof运算符 。这就是错误发生的地方。将名称传递给将使用typeof的函数并不重要;该函数永远不会被调用,因为错误已经发生。

如果您为其提供现有变量名称,您的函数将按预期工作。然后它会告诉你该变量是否具有undefined值:

var boo;  // now boo exists but has the undefined value
console.log( isUndefined(boo) );  // will log 'true'

如果您正在检查全局变量,那么如果您说的是window.boo而不仅仅是boo,那么它将起作用。那是因为引用一个不存在的对象属性并不是一个错误;它只会在您执行此操作时为您提供undefined值:

// logs 'true' if there is no global 'boo'
console.log( isUndefined(window.boo) );

如果您想检查 local 变量是否存在,那将无效,因为它不是window对象的属性。

答案 1 :(得分:3)

让我这样说:

var a = 5;
function foo(v){
    v += 5;
    console.log(v);
}

foo(a);
console.log(a);   // will give you 5, not 10

出于同样的原因 - 当您致电

isUndefined(boo)

未发送变量boo,发送boo的值。由于在调用期间未定义boo,因此当您尝试达到它的值时会出现错误。

值得一提的是typeof不是一个函数,它是一个运算符

答案 2 :(得分:2)

通常,Javascript中用于尝试访问不存在的变量的行为是抛出ReferenceError。 typeof运算符在这里是例外,因为如果你传递一个不存在的变量,它的特殊编码不会产生这样的错误。

http://es5.github.io/#x11.4.3

  

11.4.3运营商#Ⓣ

的类型      

评估生产UnaryExpression:typeof UnaryExpression   如下:

Let val be the result of evaluating UnaryExpression.

If Type(val) is Reference, then

    If IsUnresolvableReference(val) is true, return "undefined".

    Let val be GetValue(val).

为了避免ReferenceError,您可以事先声明boo而不指定任何内容:

var boo;
console.log(isUndefined(boo));
console.log(typeof boo == 'undefined')