Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/471.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 声明没有var关键字的变量_Javascript_Variables_Global Variables_Declaration - Fatal编程技术网

Javascript 声明没有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

在学校里,有这样的文字:

如果您声明一个变量,而不使用“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.始终仔细阅读警告并解决它们。使用
“严格使用”、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"