Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.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_Scope_Var - Fatal编程技术网

javascript,为什么不删除var关键字?

javascript,为什么不删除var关键字?,javascript,scope,var,Javascript,Scope,Var,几乎所有的javascript书籍都这么说 当您需要时,请始终使用var关键字 声明变量,因为没有 变量,则该变量将声明为 全局变量 那么,为什么不删除var关键字,将默认声明作为本地范围呢? 与Python一样,如果要使用全局变量,可以编写: global foo; 我们几乎总是使用局部变量,不是吗? 有充分的理由吗? 谢谢你的帮助 编辑: 谢谢你们的帮助,我想一定有一个很好的理由表明使用var更好,所以我并没有试图改变语言 var globalInt = 5; function Hel

几乎所有的javascript书籍都这么说

当您需要时,请始终使用var关键字 声明变量,因为没有 变量,则该变量将声明为 全局变量

那么,为什么不删除var关键字,将默认声明作为本地范围呢? 与Python一样,如果要使用全局变量,可以编写:

global foo;
我们几乎总是使用局部变量,不是吗? 有充分的理由吗? 谢谢你的帮助


编辑: 谢谢你们的帮助,我想一定有一个很好的理由表明使用var更好,所以我并没有试图改变语言

var globalInt = 5;

function Hello()
{
    // Hey, give me back my var keyword!
    // I want to assign a global existing variable
    globalInt = 7; 
}

另一点是,没有简单的方法从JavaScript中删除内容。每一项功能(甚至黑客)都已经在数千个网站上使用,删除这些功能将破坏这些网站。JavaScript只能被扩展。或者应该创建与以前版本不兼容的新JS。

这正是语言的设计方式。如果变量是自动分配的,则在全局范围内进行分配

如果你仔细想想,这很有道理。变量应该分配在什么范围内?编译器无法通过显式声明了解程序员的目标


不管是好是坏,JS都是按原样设计的。我认为允许变量自动声明是一个错误,但考虑到JS中存在变量,让它们成为全局变量是有意义的,因为JS没有块级范围。

在函数中使用var关键字在局部范围声明变量,从而防止覆盖任何全局变量。这个想法是为了安全起见,使用var。如果您知道自己在做什么(100%确定不会覆盖任何全局变量),请随意放弃var

function A() {
    var foo; // variable in the scope of function A
    function B() {
        foo; // variable still in the scope of function A
    }
} 

如果选择“最窄范围”或“全局范围”,则这是不可能的。

好的,我将再次尝试解释它是如何工作的。有一个ECMAScript的
Global
对象,它是所有其他对象的“根”。在浏览器
窗口中
对象实现
全局
。因此:

function assert( condition, message ) {
  if ( !condition ) 
      if ( typeof message != 'undefined' ) alert( message ); 
      else alert( 'Free Consulting just talks rubbish' );
}

// assuming global scope
assert( this == window, 'noes!' ); // and Global context

var spam = 'for all you python lovers'; // becomes a property of Global
assert( spam == window.spam, 'there not much spam in it' ); // same

function eggs () { // becomes a method of Global actually
  assert( spam == window.spam, 'shut up!' ); // unqualified spam available here through closure
  assert( arguments.callee == window.eggs ); // and again
}
eggs();

Mrs结论:JavaScript是一种独特的语言,具有自己的特定特性,因此不要将其他语言知识应用于JS(这使Douglas Crockford成为一只悲伤的熊猫:)

但是,如果没有使用全局关键字的声明,函数Hello中的globalInt将是局部变量。我觉得这样更好。@netroyal,你是说引入另一个含义相反的关键字仅仅是因为
var
行为被更频繁地使用并且应该被设置为默认值吗?是的,我本以为是认真的,但我想知道是否有理由使用var关键字更好?使用全局变量也会降低函数速度。javascript处理器扫描函数中的变量并相应地构建堆栈框架。我认为这就是原始问题的要点——如果局部范围更好,为什么需要
var
关键字来执行默认操作。我同意你的观点。这就是javascript的设计方式。为什么编译器无法知道?JavaScript是一种基于块的语言,它完全是合理的,假设程序员打算将变量限定在它所声明的块中(与大多数其他语言的工作方式相同)。任何想要全局的东西都需要在块之外声明。@aroth:有点像aroth——但是闭包很快就会变得复杂。想想更复杂的案例吧。@Hogan,谢谢你指出这一点。我认为这是一个输入错误,答案正好相反:)@aroth,在第三方JS文件中定义一个全局变量之前,这样说很容易。但如果没有全局关键字,编译器应该在局部范围内处理所有变量,这是更好的方法吗?谢谢你的帮助。我想这也是语言设计的方式。谢谢。我没看到这个。但是使用“var”和不使用“var”只是两种风格,如果我们定义“no var”是“var exists”,那么所有的意思都是一样的,只是看起来不同而已。好吧,如果人们使用局部变量的次数不多于全局变量,为什么“始终使用var关键字”?警告(此==窗口);var spam=‘spam’;警报(垃圾邮件===window.spam);函数eggs(){alert(spam==window.spam);alert(arguments.callee==window.eggs);}eggs();你在说什么?我仔细地读了你的话,但你仔细地读了我的问题吗?无论如何,谢谢。@netroyal再次阅读了闭包和其他语言impressionOK,我认为你的代码在实际项目中的风格很好。谢谢你给出这个。我只是不明白你的意思。再次感谢。