JavaScript 变量是未定义的
javascript variable is undefined
首先,让我们看看代码。
var a=0;
b=1;
document.write(a);
function run(){
document.write(b);
var b=1;
}
run();
我认为结果是01
,但实际上,结果是0undefined
。
然后我修改此代码。
var a=0;
b=1;
document.write(a);
function run(){
document.write(this.b); //or document.write(window.b)
var b=1;
}
run();
是的,这次它按预期运行。 01
.我不明白,为什么?
更有趣的是,我再次修改代码.
var a=0;
b=1;
document.write(a);
function run(){
document.write(b);
//var b=1; //I comment this line
}
run();
结果为 01。
那么,谁能解释一下呢?
感谢您分享您的观点。我简化了这段代码
b=1;
function run(){
console.log(b); //1
}
二:
b=1;
function run(){
var b=2;
console.log(b); //2
}
三:
b=1;
function run(){
console.log(b); //undefined
var b=2;
}
当你引用函数中的变量时,JS首先检查该变量是否在当前范围内声明,即在该函数内。如果未找到,它将在包含范围内查找。如果仍然没有找到,它会在下一个作用域中向上查找,依此类推,直到最终到达全局作用域。(请记住,您可以将函数嵌套在彼此内部,因此这就是您获得多个级别的包含范围的方式,尽管您的示例当然不会这样做。
声明:
b=1;
没有var
声明一个可以在任何函数中访问的全局变量,除了在你的第一个函数中你还声明了一个局部b
。这称为变量阴影。
但是",你说,"我在document.write(b)
之后宣布当地b
"。在这里,您遇到了声明"提升"。在函数中任意位置声明的变量被 JS 解释器视为在函数顶部声明(即,它被"提升"到顶部),但是,任何值赋值都会发生。所以你的第一个函数实际上是像这样执行的:
function run(){
var b; // defaults to undefined
document.write(b); // write value of local b
b=1; // set value of local b
}
在第二个函数中使用this.b
时,你会发现this
指的是window
,而全局变量本质上是window
的属性。因此,您正在访问全局b
而忽略本地。
在第三个函数中,您根本不声明本地b
,因此它引用全局函数。
当你编写b = 1
时,你正在全局对象中创建一个属性。
在普通函数中,b
将引用此全局函数。
由于您的函数包含 var b;
,函数内的b
是指局部变量。 (var
语句在整个函数中创建局部变量,无论var
在哪里)。
但是,var
语句(b = 1
)的可执行部分只在那个时候执行。
预执行阶段处理,b
在document.write(b);
之前成为局部变量,所以此时b
是undefined
。
注意:为变量赋值是在执行时,因此您可以像下面这样想象您的代码。
function run(){
document.write(b);
var b=1;
}
与以下相同:
function run(){
var b;
document.write(b);
b=1;
}
添加:
这就是为什么将每个 var 定义放在函数的顶部是一种很好的做法。
这段代码对我来说很好用
if(var_name === "undefined"){
alert(var_name+' : undefined');
}
- Socket.IO未定义变量
- 更改 Javascript 对象中所有未定义变量的值
- coffeescript,类未定义变量
- 使用下划线未定义变量时发生抛出/捕获错误
- 网络浏览器正在成为“;严格的“;用于Javascript中未定义变量的操作
- 使用window.location时未定义变量
- 传递给数据的未定义变量
- bizzare未定义变量
- JavaScript 中全局范围内存在未定义变量的原因是什么?
- JavaScript onClick 参数表示未定义变量
- 在指令中使用 $scope.$watch 处理未定义变量的替代方法
- 对于循环错误:未捕获的引用错误,未定义变量.怎么了
- JavaScript / YouTube API - 未定义变量 YT
- 未捕获的引用错误:在测试真实性时未定义变量
- 通过使用JavaScript“未定义”(变量),我们可以释放系统内存
- 与未定义变量相关的错误
- Angularjs 控制器中的未定义变量
- 角度解析:未定义变量
- BackboneJS Uncaught ReferenceError:未定义变量
- 使用Underscore JS部分和for循环的未定义变量对象