var关键字的目的是什么?何时应使用(或省略)?

注意:从ECMAScript版本3或5的角度提出了此问题。随着ECMAScript 6版本中引入新功能,答案可能会过时。

varJavaScript中关键字的功能到底是什么,它们之间有什么区别

var someNumber = 2;
var someFunction = function() { doSomething; }
var someObject = { }
var someObject.someProperty = 5;

someNumber = 2;
someFunction = function() { doSomething; }
someObject = { }
someObject.someProperty = 5;

您什么时候会使用其中一个?为什么/会做什么?

蛋蛋古一2020/03/09 20:40:31

不使用“ var”变量只能在设置值时定义。例如:

my_var;

无法在全球范围任何其他范围内工作它应具有以下值:

my_var = "value";

另一方面,您可以定义可变的like;

var my_var;

它的值是undefined(它的值不是,null并且null有趣地不等于。)。

神奇神无A2020/03/09 20:40:31

当有人试图学习这一点时,这就是我的看法。对于初学者来说,以上示例可能有点过于复杂。

如果运行此代码:

var local = true;
var global = true;


function test(){
  var local = false;
  var global = false;
  console.log(local)
  console.log(global)
}

test();

console.log(local);
console.log(global);

输出将显示为:false,false,true,true

因为它认为函数中的变量与函数外的变量是分开的,所以使用术语局部变量,这是因为我们在赋值中使用了var。如果删除函数中的var,则它现在如下所示:

var local = true;
var global = true;


function test(){
  local = false;
  global = false;
  console.log(local)
  console.log(global)
}

test();

console.log(local);
console.log(global);

输出为false,false,false,false

这是因为与其在局部作用域或函数中创建新变量,不如直接使用全局变量并将它们重新分配为false。

小哥宝儿2020/03/09 20:40:31

在代码内部,如果您使用变量而不使用var,那么会发生的是自动将var var_name放置在全局范围内,例如:

someFunction() {
    var a = some_value; /*a has local scope and it cannot be accessed when this
    function is not active*/
    b = a; /*here it places "var b" at top of script i.e. gives b global scope or
    uses already defined global variable b */
}
JinJinLEY2020/03/09 20:40:31

没有var-全局变量。

强烈建议始终使用use var语句,因为在局部上下文中初始化全局变量是有害的。但是,如果您需要这个肮脏的把戏,则应在页面开头写评论:

/* global: varname1, varname2... */
逆天路易2020/03/09 20:40:31

使用var总是一个好主意,以防止变量混乱全局范围和变量彼此冲突,从而导致不必要的覆盖。

西门蛋蛋2020/03/09 20:40:31

我会说最好var在大多数情况下使用

局部变量总是比全局范围内的变量快。

如果不使用var声明变量,则该变量将位于全局范围内。

有关更多信息,您可以在Google中搜索“范围链JavaScript”。

阳光十三2020/03/09 20:40:31

另一个区别,例如

var a = a || [] ; // works 

a = a || [] ; // a is undefined error.
LEY猿2020/03/09 20:40:31

不要使用var

var是ES6之前的变量声明方法。我们现在在将来,您应该这样编码。

使用constlet

const应该用于95%的情况。这样一来,变量引用就不会更改,因此数组,对象和DOM节点属性可以更改,并且应该更改为const

let应该用于期望重新分配的任何变量。这包括在for循环中。如果您写的内容varName =超出初始化范围,请使用let

正如大多数其他语言所期望的那样,它们都具有块级作用域。

神奇JinJin2020/03/09 20:40:31

Always use the var keyword to declare variables. Why? Good coding practice should be enough of a reason in itself, but omitting it means it is declared in the global scope (a variable like this is called an "implied" global). Douglas Crockford recommends never using implied globals, and according to the Apple JavaScript Coding Guidelines:

Any variable created without the var keyword is created at the global scope and is not garbage collected when the function returns (because it doesn’t go out of scope), presenting the opportunity for a memory leak.

A逆天猿2020/03/09 20:40:31

在浏览器中执行Javascript时,所有代码都被with语句包围,如下所示:

with (window) {
    //Your code
}

有关更多信息with-MDN

由于在当前范围内var声明了变量,因此在内部窗口中声明与完全不声明之间没有区别var

当您不直接在窗口内部(例如在函数内部或在块内部)时,就会出现区别。

使用var可以隐藏具有相同名称的外部变量。这样,您可以模拟“私有”变量,但这是另一个主题。

经验法则是始终使用var,因为否则会冒引入细微错误的风险。

编辑:在收到我的批评之后,我想强调以下几点:

  • var在当前范围内声明一个变量
  • 全局范围是 window
  • 在全局范围内不使用var隐式声明var(窗口)
  • 在全局范围(窗口)中使用声明变量var与省略变量相同。
  • 声明在使用窗口不同的范围的变量var 是不一样的东西作为声明的变量,而不var
  • 始终var明确声明,因为这是一个好习惯
斯丁理查德2020/03/09 20:40:31

说这是“ 本地”和“ 全球之间的差异并不完全准确。

最好将其视为“ 本地”和“ 最近之间的区别最接近的肯定是全局的,但情况并非总是如此。

/* global scope */
var local = true;
var global = true;

function outer() {
    /* local scope */
    var local = true;
    var global = false;

    /* nearest scope = outer */
    local = !global;

    function inner() {
        /* nearest scope = outer */
        local = false;
        global = false;

        /* nearest scope = undefined */
        /* defaults to defining a global */
        public = global;
    }
}
2020/03/09 20:40:31

这是一个很好的示例,说明了如何通过不声明局部变量而陷入困境var

<script>
one();

function one()
{
    for (i = 0;i < 10;i++)
    {
        two();
        alert(i);
    }
}

function two()
{
    i = 1;
}
</script>

i在循环的每次迭代中重置,因为它不是在for循环中本地声明,而是在全局中声明)最终导致无限循环

JinJin西门2020/03/09 20:40:31

如果您位于全球范围内,则没有太大区别。阅读Kangax的答案以获取解释

如果您在函数中,var则将创建一个局部变量,“ no var”将查找作用域链,直到找到该变量或达到全局作用域为止(此时将创建该变量):

// These are both globals
var foo = 1;
bar = 2;

function()
{
    var foo = 1; // Local
    bar = 2;     // Global

    // Execute an anonymous function
    (function()
    {
        var wibble = 1; // Local
        foo = 2; // Inherits from scope above (creating a closure)
        moo = 3; // Global
    }())
}

如果您不做作业,则需要使用var

var x; // Declare x