可变阴影和测试存在的JavaScript转让前(Variable shadowing and tes

2019-09-19 14:30发布

在下面的代码片段,我宣布一个全局变量,然后检查其在函数内部存在。

<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(分析)。

Answer 1:

您正在寻找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;


Answer 2:

第一个例子记录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的作用域和提升 ,以更好地理解它。



Answer 3:

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