在使用javascript闭包时,我最终会遇到一个我无法解释的问题。
(function() {
console.log("Inside closure"); //does not work
}(foo));
它不能工作,因为foo是未定义的。referenceError
但如果我之前设置了var foo = undefined;
,它就能工作(在Chrome和ff上测试)。
被设置为未定义是不一样的?
发布于 2016-02-07 14:27:02
在javaScript中,“未定义”是原始数据类型之一。它表示对象的类型。
var a = undefined;
var b;
console.log((typeof(a)));
console.log((typeOf(b)));
对于这两种情况,输出都是未定义的。
如果您根本不声明变量并尝试访问它,则引发的错误如下。我试图访问根本没有声明的c。未定义未定义的ReferenceError: C(…)
发布于 2016-02-07 14:16:44
如果问题是:
但是,如果有人使用了通用的jQuery包装器,而jQuery脚本还没有工作,那该怎么办?
如果jQuery标识符不在全局范围内,则仍然会得到引用错误,因为它试图查找对jQuery的引用,但它将不存在。
未定义关键字将在闭包中传递,以便如果为未定义的关键字分配了一个值,它将不会扰乱您的代码。例如:
var undefined = 123
if(undefined){
console.log("pass")
}
这个密码会通过的。如果您传递未定义的参数,但在调用参数时省略它,则未定义的参数将没有分配给它的值。它不会寻找引用,因为您还没有分配参数,例如:
(function(undefined){
// undefined will be undefined.
}())
我为您做了一个简单的例子:https://jsfiddle.net/gn7h3641/
TLDR :如果您向JavaScript请求一个不存在的变量(未用var定义)的值,它会爆炸,因为它还没有找到值,这与检查‘if (测试===未定义)’中的未定义变量不同。
发布于 2016-02-07 14:20:46
拥有一个值未定义的变量与没有该名称的变量是不一样的。
在ECMAScript中,标识符根据标识符解析解析,标识符解析返回GetIdentifierReference提供的引用。
如果变量不存在,则该引用的基值将未定义,否则将成为环境记录。
当GetValue获得该引用的值时,它将检查IsUnresolvableReference。如果基值未定义,它将返回false,GetValue将抛出一个ReferenceError异常。
如果变量存在(即使其值未定义),GetValue将返回其值。
如果您不确定是否存在某个变量,则可以使用运算符,它返回用于不可解析引用的"undefined"
,而不是抛出。
https://stackoverflow.com/questions/35259664
复制相似问题