Javascript 使用“分配变量”;var";或者没有关键字

Javascript 使用“分配变量”;var";或者没有关键字,javascript,Javascript,当我尝试记录时,a将返回未定义的错误,但是,当我尝试记录时,b或c将返回值1。这太糟糕了。b和c被添加到窗口对象中,并将它们的值作为1。但是a是通过var声明的。这意味着a仅在函数上下文中可见,而不在其外部可见 你的代码是等价的 (function foo() { var a=b=c=1 }()) b和c被添加到窗口对象中,并获得它们的值为1。但是a是通过var声明的。这意味着a仅在函数上下文中可见,而不在其外部可见 你的代码是等价的 (function foo() { var a=b=c=1

当我尝试记录时,a将返回未定义的错误,但是,当我尝试记录时,b或c将返回值1。这太糟糕了。

b
c
被添加到窗口对象中,并将它们的值作为
1
。但是
a
是通过
var
声明的。这意味着
a
仅在函数上下文中可见,而不在其外部可见

你的代码是等价的

(function foo() { var a=b=c=1 }())

b
c
被添加到窗口对象中,并获得它们的值为
1
。但是
a
是通过
var
声明的。这意味着
a
仅在函数上下文中可见,而不在其外部可见

你的代码是等价的

(function foo() { var a=b=c=1 }())
但是,当我尝试记录b或c时,将返回值1

因为您没有使用
var
let
const
b
c
的作用域(函数内部)进行本地化

如果没有
var
let
const
,这些变量将采用定义此函数的范围

如果外部作用域(不是最外部的)也没有本地化这些变量,则再次检查父作用域,直到找到最外部的作用域(
窗口
)。如果没有为变量定义局部作用域,则将变量添加到最外层的作用域。比如说

函数a(){
(函数foo(){
变量a=b=c=1;
}());
console.log(b,c);//打印1,1
}
a();
控制台日志(b,c)//打印1,1
但是,当我尝试记录b或c时,将返回值1

因为您没有使用
var
let
const
b
c
的作用域(函数内部)进行本地化

如果没有
var
let
const
,这些变量将采用定义此函数的范围

如果外部作用域(不是最外部的)也没有本地化这些变量,则再次检查父作用域,直到找到最外部的作用域(
窗口
)。如果没有为变量定义局部作用域,则将变量添加到最外层的作用域。比如说

函数a(){
(函数foo(){
变量a=b=c=1;
}());
console.log(b,c);//打印1,1
}
a();

控制台日志(b,c)//打印1,1
如果您有很多构造,需要初始化为某些常量,并且可以使用ES6功能,下面是一个很好的方法

//在库中存储函数
函数*initVar(值){
而(真实)收益值;
}
//使用功能
允许
[a,b,c]=initVar(0),
[d,e,f]=initVar(“xyz”)//不仅限于数字。

控制台日志(a、b、c、d、e、f)如果您有很多构造,需要初始化为某些常量,并且可以使用ES6功能,那么下面是一个很好的方法

//在库中存储函数
函数*initVar(值){
而(真实)收益值;
}
//使用功能
允许
[a,b,c]=initVar(0),
[d,e,f]=initVar(“xyz”)//不仅限于数字。

控制台日志(a、b、c、d、e、f)您没有问任何问题。请始终使用“严格”模式以防止此类错误发生<代码>(函数foo(){“use strict”;var a=b=c=1}())
您还没有问任何问题。请始终使用严格模式以防止发生类似错误<代码>(函数foo(){“严格使用”;var a=b=c=1}())
谢谢。我猜js解释器会在场景下这么做。不过还是有点奇怪。谢谢。我猜js解释器会在场景下做这件事。但它仍然有点奇怪。“指定此函数的范围”描述得很清楚。我认为前导var限制了这三个变量的范围。不,前导
var
仅适用于a,因为您使用的是赋值表达式。你的意思是
var a=1,b=1
?@BlakeWoo,我的意思是定义,而不是指定。我已经做了更改。是的,我没有意识到赋值表达式是这样运行的。@BlakeWoo ohh,您的问题/疑问现在已经回答了吗?“指定此函数的范围”描述得很清楚。我认为前导var限制了这三个变量的范围。不,前导
var
仅适用于a,因为您使用的是赋值表达式。你的意思是
var a=1,b=1
?@BlakeWoo,我的意思是定义,而不是指定。我已经做了更改。是的,我不知道赋值表达式是这样运行的。@BlakeWoo ohh,你的问题/疑问现在得到回答了吗?