在下面的代码片段,我宣布一个全局变量,然后检查其在函数内部存在。
<script>
x = 5;
$(function() {
var x = x || 3;
console.log(x); // prints 3
});
</script>
这种行为会有所不同:
<script>
x = 5;
$(function() {
var y = x || 3;
console.log(y); // prints 5
});
</script>
我预计,在第一个例子中,在内部范围内的变量声明将检测X已经存在在全球范围内,并采取它的价值。 为什么第一个示例3?
具体来说,我最近写了一些代码,检查var _gaq = _gaq || []
var _gaq = _gaq || []
在jQuery的准备范围和感到困惑没事的时候是越来越pubbed Analytics(分析)。
您正在寻找x
在错误的范围。 由于可变悬挂, var x
实际上已经定义的本地x
变量具有的价值undefined
您之前x || 3
x || 3
检查情况:
var x = x || 3;
实际上是:
var x = undefined;
x = x || 3;
简单地改变它来寻找x
上的window
对象:
var x = window.x || 3;
第一个例子记录3,因为any variable that is initialized inside a function using the var keyword will have a local scope. If a variable is initialized inside a function without var, it will have a global scope.
any variable that is initialized inside a function using the var keyword will have a local scope. If a variable is initialized inside a function without var, it will have a global scope.
因此,在第一种情况下,本地时x
分配,因为它是未初始化的,它被分配3。
而在第二种情况下, x
指的是全局变量x
,因为没有声明x
的函数的内部。
相反,如果你试试这个
<script>
x = 5;
$(function() {
x = x || 3;
console.log(x);
});
</script>
要么
<script>
x = 5;
$(function() {
var x = window.x || 3;
console.log(x);
});
</script>
你会得到预期的结果5
。
此外,与C及其家族(其具有块级别范围 ),JavaScript有功能级范围 。 块,如if语句,不创建一个新的范围。 只有函数创建一个新的范围。
所以,如果我喜欢写东西
#include <stdio.h>
int main() {
int x = 1;
printf("%d, ", x); // 1
if (1) {
int x = 2;
printf("%d, ", x); // 2
}
printf("%d\n", x); // 1
}
OUTPUT:1,2,1
相比于
var x = 1;
console.log(x); // 1
if (true) {
var x = 2;
console.log(x); // 2
}
console.log(x); // 2
OUTPUT:1,2,2
通过对这个优秀的博客帖子转到JavaScript的作用域和提升 ,以更好地理解它。
该var x
在功能申明x是本地的功能,所以在x || 3
x || 3
X不是全局x,因而是不明确的,因为它尚未初始化。
在var y = x || 3;
var y = x || 3;
x是全局X,因为没有X的本地功能。
文章来源: Variable shadowing and testing for existence before assignment in javascript