开发者

javascript, why not remove var keyword?

开发者 https://www.devze.com 2023-02-18 09:18 出处:网络
almost all javascript books said that always use var keyword when you declare variables, because without

almost all javascript books said that

always use var keyword when you declare variables, because without var, the variable will be declared as global variable.

then, why not remove var keyword, make default declaration as local scope? like Python, if you want to use global variables, you write:

global foo;

we use local variables almost all the time, don't we? is there a good reason? Thanks for any help.


edit: Thanks for all your help, I thought there must be a good reason shows that using var is better, so I was not at开发者_C百科tempting to change the language what it was like.


var globalInt = 5;

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

Another point is there is no easy way to remove something from JavaScript. Every feature (even hacks) is already used on thousands of sites and removing features will break those sites. JavaScript can only be extended. Or new JS should be created which will be incompatible with previous versions.


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

If the choice was "Narrowest scope" or "Global scope" then this wouldn't be possible.


This is just the way the language was designed. If a variable is auto-allocated it is allocated in the global scope.

It makes a lot of sense if you think about it. What scope should a variable be allocated in? The compiler has no way of knowing the programmers goal with an explicit declaration

For better or worse JS was designed the way it was. I believe allowing variables to auto-declare was a mistake but given that it exists in JS it makes sense to have them be global since JS does not have block level scope.


using var keyword inside a function declares the variable in local scope, hence preventing overwriting of any global variable. Idea is to play safe, and use var. If you know what you are doing (100% sure that you will not overwrite any global variable) feel free to discard var.


OK, i'll try to explain how it works again. There is a ECMAScript's Global object, which is "root" of everything else. In browsers window object implements Global. So:

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 Conclusion: JavaScript is distinct language with own specific traits, so do not apply other language knowledge to JS (it makes Douglas Crockford a sad panda :)

0

精彩评论

暂无评论...
验证码 换一张
取 消