javaScript 关闭。未定义的值作为输入停止脚本。有时

javaScript closures. Undefined value as input stops script. Sometimes

玩 javascript 闭包我最终遇到了这个我无法解释的问题。

(function() {
    console.log("Inside closure"); //does not work
}(foo));

它不起作用,因为 foo 未定义。参考错误

但如果我事先设置 var foo = undefined; 它会起作用(在 Chrome 和 ff 上测试)。

undefined和设置为undefined不一样吗?

example in jsfiddle

如果问题是:

But what if somebody uses the the common jQuery wrapper and has the jQuery script not working yet?

如果 jQuery 标识符不在全局范围内,你仍然会得到一个引用错误,因为它试图找到对 jQuery 的引用,但它不存在。

在闭包中传递了 undefined 关键字,这样如果给 undefined 赋值,它就不会弄乱你的代码。例如:

var undefined = 123
if(undefined){
    console.log("pass")
}

此代码将通过。如果您通过 undefined 传递但在调用它时省略了参数,则 undefined 将没有分配给它的值。它不会寻找参考,因为您没有分配参数例如:

(function(undefined){
// undefined will be undefined. 
}())

我在这里为您做了一个简单的例子:https://jsfiddle.net/gn7h3641/

TLDR :如果您向 JavaScript 询问不存在的变量的值(未使用 var 定义),它将爆炸,因为它还没有找到该值的引用不同于检查 'if(test === undefined)'

中是否有未定义的内容

具有未定义值的变量与没有具有该名称的变量是不同的。

在 ECMAScript 中,标识符是根据 Identifier Resolution, which returns a reference given by GetIdentifierReference 解析的。

如果变量不存在,则该引用的基值将是未定义的,否则它将是一个环境记录。

GetValue gets the value of that reference, it will check IsUnresolvableReference。如果基值未定义,它将 return false,GetValue 将抛出 ReferenceError 异常。

如果变量存在(即使它的值未定义),GetValue 将return它的值。

如果不确定某个变量是否存在,可以使用the typeof operator,其中returns "undefined"用于不可解析的引用而不是抛出。

在javaScript中,'undefined'是原始数据类型之一。它表示对象的类型。

var a = undefined;
var b;

console.log((typeof(a)));
console.log((typeOf(b)));

这两种情况的输出都是未定义的。

如果您根本不声明变量并尝试访问它,抛出的错误将如下所示。我试图访问根本没有声明的 c 。 未捕获的 ReferenceError:c 未定义(…)