几乎所有的 JavaScript 书籍都这么说
声明变量时总是使用 var 关键字,因为没有 var,变量将被声明为全局变量。
那么,为什么不删除 var 关键字,将默认声明设为本地范围呢?像 Python 一样,如果你想使用全局变量,你可以这样写:
global foo;
我们几乎一直使用局部变量,不是吗?有充分的理由吗?谢谢你的帮助。
编辑:感谢您的所有帮助,我认为一定有充分的理由表明使用 var 更好,所以我没有试图改变语言的样子。
几乎所有的 JavaScript 书籍都这么说
声明变量时总是使用 var 关键字,因为没有 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。
function A() {
var foo; // variable in the scope of function A
function B() {
foo; // variable still in the scope of function A
}
}
如果选择是“最窄范围”或“全局范围”,那么这是不可能的。
这正是语言的设计方式。如果一个变量是自动分配的,它将在全局范围内分配。
如果您考虑一下,这很有意义。变量应该分配在什么范围内?编译器无法通过显式声明了解程序员的目标
无论好坏,JS 的设计方式都是如此。我相信允许变量自动声明是一个错误,但鉴于它存在于 JS 中,将它们设为全局是有意义的,因为 JS 没有块级范围。
好的,我会尝试再次解释它是如何工作的。有一个 ECMAScript 的Global
对象,它是其他一切的“根”。在浏览器window
对象实现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();
结论夫人:JavaScript 是具有自己特定特征的不同语言,所以不要将其他语言知识应用于 JS(这让 Douglas Crockford 成为一只悲伤的熊猫 :)
在函数中使用 var 关键字在局部范围内声明变量,从而防止覆盖任何全局变量。想法是安全起见,并使用 var。如果您知道自己在做什么(100% 确定不会覆盖任何全局变量),请随意丢弃 var。