Javascript 使用“分配变量”;var";或者没有关键字
当我尝试记录时,a将返回未定义的错误,但是,当我尝试记录时,b或c将返回值1。这太糟糕了。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
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,你的问题/疑问现在得到回答了吗?