Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/459.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 在全局范围内预定义变量的优点是什么?_Javascript_Coding Style_Jslint_Jshint - Fatal编程技术网

Javascript 在全局范围内预定义变量的优点是什么?

Javascript 在全局范围内预定义变量的优点是什么?,javascript,coding-style,jslint,jshint,Javascript,Coding Style,Jslint,Jshint,我经常会遇到这样的情况,我会根据自己的情绪采取行动: 情景A): function a() { var msg = 'a()'; ..operate on msg } function b() { var msg = 'b()'; ..operate on msg } var msg; function a() { msg = 'a()'; ..operate on msg } function b() { msg =

我经常会遇到这样的情况,我会根据自己的情绪采取行动:

情景A):

 function a() {
     var msg = 'a()';
     ..operate on msg
   }

   function b() {
     var msg = 'b()';
     ..operate on msg
   }
var msg;
function a() {
  msg = 'a()';
 ..operate on msg
}

function b() {
  msg = 'b()';
 ..operate on msg
}
情况B):

 function a() {
     var msg = 'a()';
     ..operate on msg
   }

   function b() {
     var msg = 'b()';
     ..operate on msg
   }
var msg;
function a() {
  msg = 'a()';
 ..operate on msg
}

function b() {
  msg = 'b()';
 ..operate on msg
}
请注意,对于“Operationonmsg”,我指的不是一个函数,而是一系列操作

我对此很感兴趣,因为JSHint指出了已经预定义的变量,尽管它们具有相同的名称,但出现在不同的函数中

更新: 我问这个问题的时候可能是不正确的,所以为了解决这个问题,我改变了功能

更新2
我了解范围。我的意思是,尽管范围很广,但两者相比还有其他优势吗?

这里几乎没有区别。。。在每种情况下都定义了变量,但如果您不使用msg变量,第一种情况将是少量数据保存:),但这太简单了。

您了解范围吗

在情况B中,变量仅在函数范围内可用

function(){
    var foo = 10;
}
console.log(foo); //undefined
在情况A中,您的变量是全局可用的

var foo;
function(){
    foo = 10;
}
console.log(foo); //10

在情况A中,从函数内部修改foo会在任何地方修改它。在情况B中,只修改局部变量。

正如其他人所建议的,您必须阅读更多关于Javascript中变量的内容。 我将尝试证明这一点

function test() {

    var t1 = msg + " hello";  
    console.log(t1); // prints "undefined hello" because msg is undefined
    var t2 = msgx + " hello"; // msgx ReferenceError

    var a = 1;
    var b = 2;
    if (a > b) {
        var msg = 'sample';
    }

}

test();
在本例中,您可以看到声明了
msg
。但它是未定义的。另一方面,
msgx
会导致参考错误。它没有在任何地方申报。因此,关键是语句
var msg='sample'
如果大括号使
msg
在函数中的任何地方都成为有效变量,则它将随后出现在函数中的
中。因此再次声明
msg
将给您预定义的变量警告


在javascript中,只有函数才能创建作用域。函数中声明的所有内容都将在整个函数范围内可用,即使存在其他控制语句的内括号。函数中不同行中声明的所有变量都将被提升并视为在函数的起始行中声明

这和闭包没什么区别,叫做变量提升:@tracevipin我用“函数”代替了它。如果我有两个定义相同变量名的函数,linters得到angry@lukas.pukenis在这个问题的第一个版本之后,我怀疑您是否完全理解JavaScript中的作用域。@Sirko,为我的问题表达得不好表示歉意。我对范围界定没有问题。我主要关心的是用很多函数重构丑陋的JS文件,如果语句中反复使用相同的变量名:)是的,这里的优化是不存在的,但是我有很多文件需要用很多函数重构,如果所有语句都反复定义相同的名称:)我明白了。。。如果你在多个情况下使用那个全局,你必须为每个情况初始化它……在没有重新初始化的情况下,你可以使用错误的数据并导致逻辑错误……我想是一样的,尽管可能还有更多的情况需要考虑。无论如何,谢谢你的洞察力!:)一般来说,globals对于某些全局标志是好的。。。这可能对你的情况有好处,但正如我说的,你必须注意你是否使用了好的数据。对不起,我没有提到,但我理解范围。我知道它是如何工作的,但在重构时,我有一个由许多函数组成的大文件,这些函数反复使用相同的变量名。这就是我问题背后的原因