我看了很多关于“no var”主题的问题/答案,但我仍然感到困惑
“no var”将查找范围链,直到找到变量或 达到全球范围(此时它将创建它)
我明白这一点,但如果确实发现了什么,那么“无变量”会怎么做?例如,如果你想改变一个现有的变量或绑定,你是否再次使用var / let,或者如果你不这样做就可以了吗?有区别吗?
答案 0 :(得分:1)
如果没有使用var
,let
或const
语句,请执行以下操作:
x = 100;
将变量分配给全局范围,或者在范围内找到它时重新分配,通常不是所需的行为,因为这会导致范围混乱,或者变量覆盖,所以奇怪的错误。 / p>
要在范围内的任何位置重新分配变量,只需使用与上述相同的方法:
x = 101;
如果你有这样的事情:
//global scope
var z = 40;
(function () {
//scope »level 1«
var x = 100;
//implicitly declared in global scope
y = 300;
z += 1;
console.log(z); //41
(function () {
//scope »level 2«
x = 101;
z += 1;
})();
console.log(x) // 101;
console.log(y) // 300;
console.log(z) // 42;
})();
console.log(x) // undefined;
console.log(y) // 300;
console.log(z) // 42;
以有用的方式使用范围链的基本示例:
//create a »working scope«
//to prevent cluttering the global
(function () {
var getID = (function () {
//hide the id variable in child scope
//to prevent it from modification
var id = 0;
return function () {
//modify and return values
//from this scope
id += 1;
return id;
}
})();
//that doen't make much sense,
//but is also a example of using a
//working scope
var usedIds = Array.prototype.slice
.call(document.querySelectorAll('.a-class'))
.map(function (node) {
var id = 'my-id-' + getID();
node.id = id;
return id;
});
// export/expose variables to the global scope explicitly
window.globallyNeeded = usedIds;
})();
答案 1 :(得分:1)
简短的回答是否定的,而不是现代的JavaScript。
过去JavaScript粗略设计的一个特点是无论你是否愿意,都会自动创建变量。
这意味着以下代码:
static
会导致创建两个变量(JavaScript,当然,区分大小写),并且您的代码中会出现逻辑错误。
在现代代码中,您应该从apple=3;
Apple=apple+4;
alert(apple);
指令开始,这将禁止未声明的变量:
'use strict'
'use strict';
var apple=3;
Apple=apple+4; // error: undeclared Apple
alert(apple);
有助于缩小差距,导致代码邋and且难以管理。尝试分配未声明的变量时会引发错误。
'use strict'
关键字提供两个角色。首先,它声明变量,从而通知JavaScript解释器它是有意的。其次,它还设置变量的范围 - 范围将是包含环境的范围,通常是声明变量的函数。
更现代的JavaScript添加了var
,它锁定了一个变量(一个只读变量)的值,const
为变量提供了更有限的范围。
您通常应该使用let
指令,这将强制养成良好的习惯。在任何情况下,您都应该始终将变量/常量声明为仔细代码设计的一部分。
在我看来,任何发现声明变量过于艰巨的人都是一个糟糕的开始,可能不应该编写JavaScript。
答案 2 :(得分:0)
如果您在您选择的范围内初始化变量,则只能使用var
或let
。但请记住,变量初始化的let
关键字仅适用于ECMAScript 2016及更高版本。此外,const
关键字。 let
和const
之间的区别在于,第一个是变量(其值可以更改),第二个是常量(其值无法更改,它&# 39; sa fix value)。
此外,let
关键字具有更严格的范围定义。这意味着,let
关键字是特定于块范围的。只有内部块可以读取外部let
变量。但是如果你在e里面定义一个let
变量。 G。一个while块,它不存在于循环之外。
答案 3 :(得分:0)
我刚刚遇到了导致我写这篇文章的情况,我认为这是一个很好的例子:
let requestViaCEP = function (cep) {
callbackRequestViaCEP = function (resultadoCEP) {
responseViaCEP = resultadoCEP;
}
return new Promise ((resolve, reject) => {
$.getScript("https://viacep.com.br/ws/" + cep + "/json/?callback=callbackRequestViaCEP", function(resultadoCEP){
// console.dir(CEP.responseViaCEP)
resolve(resultadoCEP)
})
}
).then((value) => { return value },
(error) => { return new Error('CEP não encontrado.') } )
}
'callbackRequestViaCEP' 函数只有在我声明它而不使用 let、var 或 const 时才可用。现在我知道它会发生,因为一旦你不使用它们,变量就会进入全局 escope。我不确定这是否是最好的策略,如果不是,我希望你们让我知道,但现在这是我找到的唯一方法。
顺便说一下,这是我第一次看到它发生,觉得它很酷:)