Javascript 在不同范围内重新声明变量

Javascript 在不同范围内重新声明变量,javascript,scope,Javascript,Scope,我今天偶然发现了一些JavaScript,如下所示: var x = "abc"; var y = true; if (y) { var x = "xyz"; } alert(x); 作为一名Perl开发人员,这看起来像是一个bug,因为x是在更严格的范围内重新声明的,分配的值应该丢失。然而,在测试中,代码似乎按照预期工作 如果像这样重新声明一个变量,var是否被忽略并保持原始范围?Javascript只具有函数范围,而不具有块范围。第二个var x=被视为普通赋值,就好像它只是x

我今天偶然发现了一些JavaScript,如下所示:

var x = "abc";
var y = true;

if (y) {
    var x = "xyz";
}

alert(x);
作为一名Perl开发人员,这看起来像是一个bug,因为
x
是在更严格的范围内重新声明的,分配的值应该丢失。然而,在测试中,代码似乎按照预期工作


如果像这样重新声明一个变量,
var
是否被忽略并保持原始范围?

Javascript只具有函数范围,而不具有块范围。第二个
var x=
被视为普通赋值,就好像它只是
x=
,因为变量已经声明。

Javascript只具有函数作用域,而不是块作用域。第二个
var x=
被视为普通赋值,就好像它只是
x=
,因为变量已经声明。

Javascript只具有函数作用域,而不是块作用域。第二个
var x=
被视为普通赋值,就好像它只是
x=
,因为变量已经声明。

Javascript只具有函数作用域,而不是块作用域。第二个
var x=
被视为普通赋值,就好像它只是
x=
,因为变量已经声明。

在JS中,只有全局(窗口)和函数范围

var x = 1;
function a() { var x = 2; return x; }

alert(x); //1
alert(window.x); //1
alert(a()); //2
即使在块内定义变量,它也将存在于整个范围内

for (var i = 0; i < 10; i++) {
    var k = i+1;
}

alert(i);  //10
alert(window.k);  //10
for(变量i=0;i<10;i++){
var k=i+1;
}
警报(一)//10
警报(window.k)//10
编辑:正因为如此,好的JS代码在每个作用域的开头定义了它的变量

var i,j,max = 10;

function a() {
    var i,j,k;
    for (i = 0; i < max; i++) {
        j = i * 2;
        k = i / 2;
    }
    return i * j * k;
}

i = a();
j = a() * 2;
var i,j,max=10;
函数a(){
变量i,j,k;
对于(i=0;i
在JS中,只有全局(窗口)和功能范围

var x = 1;
function a() { var x = 2; return x; }

alert(x); //1
alert(window.x); //1
alert(a()); //2
即使在块内定义变量,它也将存在于整个范围内

for (var i = 0; i < 10; i++) {
    var k = i+1;
}

alert(i);  //10
alert(window.k);  //10
for(变量i=0;i<10;i++){
var k=i+1;
}
警报(一)//10
警报(window.k)//10
编辑:正因为如此,好的JS代码在每个作用域的开头定义了它的变量

var i,j,max = 10;

function a() {
    var i,j,k;
    for (i = 0; i < max; i++) {
        j = i * 2;
        k = i / 2;
    }
    return i * j * k;
}

i = a();
j = a() * 2;
var i,j,max=10;
函数a(){
变量i,j,k;
对于(i=0;i
在JS中,只有全局(窗口)和功能范围

var x = 1;
function a() { var x = 2; return x; }

alert(x); //1
alert(window.x); //1
alert(a()); //2
即使在块内定义变量,它也将存在于整个范围内

for (var i = 0; i < 10; i++) {
    var k = i+1;
}

alert(i);  //10
alert(window.k);  //10
for(变量i=0;i<10;i++){
var k=i+1;
}
警报(一)//10
警报(window.k)//10
编辑:正因为如此,好的JS代码在每个作用域的开头定义了它的变量

var i,j,max = 10;

function a() {
    var i,j,k;
    for (i = 0; i < max; i++) {
        j = i * 2;
        k = i / 2;
    }
    return i * j * k;
}

i = a();
j = a() * 2;
var i,j,max=10;
函数a(){
变量i,j,k;
对于(i=0;i
在JS中,只有全局(窗口)和功能范围

var x = 1;
function a() { var x = 2; return x; }

alert(x); //1
alert(window.x); //1
alert(a()); //2
即使在块内定义变量,它也将存在于整个范围内

for (var i = 0; i < 10; i++) {
    var k = i+1;
}

alert(i);  //10
alert(window.k);  //10
for(变量i=0;i<10;i++){
var k=i+1;
}
警报(一)//10
警报(window.k)//10
编辑:正因为如此,好的JS代码在每个作用域的开头定义了它的变量

var i,j,max = 10;

function a() {
    var i,j,k;
    for (i = 0; i < max; i++) {
        j = i * 2;
        k = i / 2;
    }
    return i * j * k;
}

i = a();
j = a() * 2;
var i,j,max=10;
函数a(){
变量i,j,k;
对于(i=0;i
如果块在javascript
x
中没有不同的作用域,则只会重新声明为是。我认为,这些信息非常基本,可以在关于js的任何书籍中找到。如果块在javascript
x
中没有不同的作用域,那么问题不在于堆栈溢出。我认为,这些信息非常基本,可以在任何关于js的书中找到。如果块在javascript
x
中没有不同的作用域,那么问题不在于堆栈溢出。我认为,这些信息非常基本,可以在任何关于js的书中找到。如果块在javascript
x
中没有不同的作用域,那么问题不在于堆栈溢出。我认为,这些信息非常基本,可以在任何关于js的书中找到。问题不在于javascript 1.7中的堆栈溢出,您将能够使用“let”而不是“var”在块范围中声明变量。另外,在javascript中,两次声明变量不是错误。忽略第二个声明,但如果有赋值,则只考虑赋值。在javascript 1.7中,您可以使用“let”而不是“var”在块范围中声明变量。另外,在javascript中,两次声明变量不是错误。忽略第二个声明,但如果有赋值,则只考虑赋值。在javascript 1.7中,您可以使用“let”而不是“var”在块范围中声明变量。另外,在javascript中,两次声明变量不是错误。忽略第二个声明,但如果有赋值,则只考虑赋值。在javascript 1.7中,您可以使用“let”而不是“var”在块范围中声明变量。另外,在javascript中,两次声明变量不是错误。忽略第二个声明,但如果存在赋值,则只考虑该赋值。