如果您声明了一个无法删除的变量,我会阅读 如果你未提出申报,你可以 我还读过,如果你没有声明一个变量,它可能会在以后引起问题。
我使用过的某些lints指出了我写过的一些内容中的声明和未申报的问题,为了停止报告这些问题,并根据我迄今为止阅读的所有信息,我选择宣布所有我的变数。
现在这就是让我感到困惑的地方。
我正在尝试构建一个使用Math.random
例程的随机名称生成器,当我尝试回收它添加到前一个例程的例程时,我试图设置var undefined / null(这本身就是可以是已定义的变量)并且它仍然只是将新结果添加到旧结果中,如果您不喜欢旧名称,则会产生重新生成新名称的功能。
写完这篇文章后,我意识到我的问题是两部分:
除了改变变量的固有属性(主要是否可以删除变量)之外,我还没有找到有关声明和未声明之间差异的任何可靠信息。
var nameLength = Math.floor(Math.random() * (13 - 3) + 3); /* min 3 max 13*/
testValue = Math.floor(Math.random() * (13 - 3) + 3);
var compareLetter = 0;
var randomLetter = "";
var randomName = "";
var capitolLetter = "";
var checkLetter = 0;
var nameTitle = "XXX"; /* titles add _ between title and name*/
var nameLetters = [
["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"],
["a", "e", "i", "o", "u"],
["b", "c", "d", "f", "g", "h", "j", "k", "l", "m", "n", "p", "q", "r", "s", "t", "v", "w", "x", "y", "z"]
];
if (nameTitle !== "") { /* my attempt to subtract title length +1 from name length if over 13*/
nameLength = nameLength + (nameTitle.length + 1);
if (nameLength > 13) {
nameLength = nameLength - (nameLength - 13);
}
}
for (i = 0; i < nameLength; i++) {
randomLetter = nameLetters[compareLetter][Math.floor(Math.random() * nameLetters[compareLetter].length)];
checkLetter = nameLetters[1].indexOf(randomLetter);
if (checkLetter > -1) { /* my version of keeping consanants and vowels from stacking up */
compareLetter = 2;
} else {
compareLetter = 1;
}
if (randomName.length < 1) { /* my version to keep first letter capitolized*/
capitolLetter = randomLetter.toUpperCase();
randomName = randomName + capitolLetter;
} else {
randomName = randomName + randomLetter;
}
}
if (nameTitle !== "") {
alert(nameTitle + "_" + randomName);
} else {
alert(randomName);
}
alert("this is nameLength" + nameLength);
alert("this is testValue " + testValue);
delete nameLength;
delete testValue;
alert("this is nameLength" + nameLength);
alert("this is testValue " + testValue); /* notice this was not displayed*/
http://jsfiddle.net/OldGuyGamer/PJsZ3/4/
这是我正在使用的内容,请记住,每次运行后,小提琴似乎都是GC,我设置的环境不会这样做。
答案 0 :(得分:2)
如果您声明了一个无法删除的变量,我会阅读。
是肯定的。例如 var foo = 1; 删除foo; 的console.log(FOO); // 1
但要采取的方法是...... 不删除变量
仅删除成员。例如delete foo.bar
您可以将其重新初始化为空状态,即foo = undefined
答案 1 :(得分:1)
如何从var中删除值并重新启动?
您无法删除已声明的全局变量,因为ECMA-262表示它们必须被初始化为不可删除。您无法删除声明的函数变量,因为您无法访问它们所附加的“变量对象”。
声明你的变量真的那么重要
声明变量将其范围限制为当前执行上下文。不声明变量意味着当执行赋值的代码时,它变为全局对象的属性。如果所有变量都是全局变量,则会开始遇到名称冲突的问题,例如: for循环中的每个计数器在每个函数的每个循环中都必须不同。
因此,如果您想要“删除变量”,那么将它们作为某些全局对象的属性,您可以将它们或多或少地视为变量并删除它们,例如。
var u = void 0;
var globalObj = {varOne:u, varTwo:u, varThree:u};
delete globalObj.varOne;
您可以使用全局对象执行类似的操作,例如:
var globalObj = this;
varOne = varTwo = varThree = void 0;
delete globalObj.varOne;
我认为第一种方法是首选方法,但是您没有提供足够的细节来提供更适合您案例的客观分析。
我还没有找到关于它们之间差异的任何可靠信息 声明和未声明,而不是改变固有属性 变量(主要是否可以删除变量)
变量初始化时是否声明变量:使用 var ,在执行任何代码之前,会创建变量并初始化为 undefined 。如果没有 var ,则在执行分配给它们的代码之前,变量不存在(如果赋值是有条件的,则可能永远不会存在)。