Javascript 声明没有var关键字的变量
在学校里,有这样的文字: 如果您声明一个变量,而不使用“var”,则该变量始终变为全局变量Javascript 声明没有var关键字的变量,javascript,variables,global-variables,declaration,Javascript,Variables,Global Variables,Declaration,在学校里,有这样的文字: 如果您声明一个变量,而不使用“var”,则该变量始终变为全局变量 在函数中声明全局变量有用吗?我可以想象在一些事件处理程序中声明一些全局变量,但它有什么好处呢?更好地使用RAM?不,没有RAM的好处或类似的东西 我所说的就是我所说的。考虑这个函数: function foo() { var variable1, variable2; variable1 = 5; varaible2 = 6; return variable1 + var
在函数中声明全局变量有用吗?我可以想象在一些事件处理程序中声明一些全局变量,但它有什么好处呢?更好地使用RAM?不,没有RAM的好处或类似的东西 我所说的就是我所说的。考虑这个函数:
function foo() {
var variable1, variable2;
variable1 = 5;
varaible2 = 6;
return variable1 + variable2;
}
看起来很简单,但它返回的是NaN
,而不是11
,因为varaible2=6上的输入错误代码>行。它创建了一个带有键入名称的全局变量:
函数foo(){
变量1,变量2;
变量1=5;
变量2=6;
返回变量1+变量2;
}
console.log(foo());//楠
console.log(varaible2);//6?!?!?!代码>全局变量的唯一用途是如果需要全局访问它们。在这种情况下,您应该在函数外部使用var
关键字来声明它们,以明确您确实想要创建全局变量,并且在尝试声明局部变量时不要忘记var
通常,您应该尝试确定代码的范围,以便在全局范围内尽可能少地使用代码。脚本中使用的全局变量越多,就越不可能与其他脚本一起使用
通常情况下,函数中的变量应该是局部变量,这样当您退出函数时它们就会消失。有时在函数中创建新的全局可访问属性非常有用,以后可以通过引用窗口对象轻松访问这些属性(所有全局声明的属性都附加到窗口对象)
但是,与通常将任何内容声明为全局可访问时一样,它可能会导致以后出现问题,因为这些属性很容易被覆盖等。最好是将值作为参数传递给函数并检索其结果。主要问题是其他人可能已经在使用同名的全局
然后,当您更改全局变量的值时,您将覆盖它们的值
稍后,当下次使用全局变量时,它将神秘地发生变化。忘记var的副作用
隐式全局变量和显式定义的全局变量之间有一个细微的区别。
不同之处在于使用delete运算符取消定义这些变量的能力:
•使用var创建的全局变量(在任何函数之外的程序中创建的)
无法删除
•不使用var创建的隐含全局变量(无论是否在函数内部创建)可以
删除
这表明隐含全局变量在技术上不是实变量,但它们是属性
全局对象的。属性可以使用delete运算符删除,而变量
不能:
在ES5严格模式中,对未声明变量(如两个反模式)的赋值
在前面的代码段中)将引发错误
JavaScript模式,由斯托扬·斯特凡诺夫(O'Reilly)撰写。版权所有2010雅虎!,公司,9780596806750。我想说,这可能会损害您的安全性,甚至是代码的稳定性
正如上面提到的,您可能会犯错误,简单地拼写您的变量,解决方案是关键字“use strict”代码>
声明此关键字后,将抛出一个错误:uncaughtreferenceerror:foo未定义
它还指安全代码:
1.在编写安全代码时,我们不希望在实际声明变量的地方之外的任何地方访问变量。不要在没有必要的情况下声明全局变量。
2.始终仔细阅读警告并解决它们。使用“严格使用”使用code>、JSlint和其他工具来查看和解决警告,从而使代码变得更好。在函数内部声明变量而不使用var、let或const,与在函数内部声明变量时使用var、let或const相比,没有什么用处。而且,正如前面对这个问题的回答所指出的,函数本地、隐式全局声明在声明它们的函数范围之外可能会引起混淆和问题
我想谈谈w3schools的引用和之前对这个问题的回答中缺少的一些微妙之处
首先,如果从不调用生成隐式全局变量的函数,则不会生成任何隐式全局变量。这与w3schools的引用有细微的区别,因为它违背了他们声明中的“始终”部分
函数generateImplicitGlobals(){
x=“x”;
window.y=“y”;
}
//在调用generateImplicitGlobals函数之前,我们可以安全地看到window对象的x和y属性都未定义:
log(“在调用generateImplicitGlobals函数之前,window对象的属性x和y是:“+window.x+”和“+window.y”);
//在调用generateImplicitGlobals函数之前,我们可以测试全局变量x和y的存在性;请注意,我们得到的是错误,而不是未定义的错误。
试一试{
log(“在调用generateImplicitGlobals函数之前,x是:”+x);
}
捕获(e){
log(“在调用generateImplicitGlobals函数之前,尝试引用某个全局变量x会产生“+e”);
}
试一试{
log(“在调用generateImplicitGlobals函数之前,y为:”+y);
}
捕获(e){
log(“在调用generateImplicitGlobals函数之前,尝试引用全局变量b也会产生“+e”);
}
奇怪的是,javascript允许使用无用的构造,但只有在我们键入错误时才会导致问题。@xraf:所有语言都允许使用可能被误用的构造<代码>while(true)我想起了“其他人”,可能是你,但你忘了你已经在其他地方用过这个名字了
// define three globals
var global_var = 1;
global_novar = 2; // antipattern
(function () {
global_fromfunc = 3; // antipattern
}());
// attempt to delete
delete global_var; // false
delete global_novar; // true
delete global_fromfunc; // true
// test the deletion
typeof global_var; // "number"
typeof global_novar; // "undefined"
typeof global_fromfunc; // "undefined"