使用‘var’声明变量是可选的吗?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (10)
  • 关注 (0)
  • 查看 (133)

这个问题已经有了一个答案:

  • var关键字的用途是什么?何时使用它(或省略它)?17项答复

“var”是可选的吗?

myObj = 1;

和你一样?

var myObj = 1;

我发现他们都是在我的测试中工作的,我想var是可选的。是这样吗?

提问于
用户回答回答于

它们的意义不同。如果你用var变量是在你所在的范围内声明的(例如函数)。如果你不使用var,该变量在作用域的各个层中冒泡,直到通过给定的名称或全局对象(如果在浏览器中执行此操作的窗口)遇到变量为止,然后将其附加到其中。那就是非常相似一个全局变量。但是,它仍然可以用delete(很可能是其他人的代码也没有使用var)。如果你使用var在全局范围内,变量是真正的全球性不能删除。

在我看来,这是javascript中最危险的问题之一,应该被废弃,或者至少对警告提出警告。原因是很容易忘记var并意外地将一个公共变量名绑定到全局对象。这会产生奇怪且难以调试的行为。

用户回答回答于

一个好的测试和一个实际的例子就是在上面的场景中发生的事情...... 开发者在他的一个变量中使用了JavaScript函数的名字。

用户回答回答于

看看这个Fiddle:http://jsfiddle.net/GWr6Z/2/

function doMe(){

a = "123"; // will be global
var b = "321"; // local to doMe
alert("a:"+a+"  --  b:"+b);

b = "something else"; // still local (not global)
alert("a:"+a+"  --  b:"+b);

};


doMe()
alert("a:"+a+"  --  b:"+b); // `b` will not be defined, check console.log
用户回答回答于

Javascript中的var关键字是为了某种目的而存在的。

如果你声明一个没有var关键字的变量,如下所示:

myVar = 100;

如果使用var关键字声明变量,如下所示:

var myVar = 100;

这是处理变量的更安全的方法

用户回答回答于

未声明的变量(没有var)被视为全局对象的属性。(通常是window对象,除非您在with块)

声明变量var是正常的局部变量,在声明它们的函数之外是不可见的。(注意Javascript没有块范围)

用户回答回答于

围绕这一主题存在着如此多的混乱,现有的答案中没有一个能清楚、直接地涵盖所有问题。下面是一些带有内联注释的示例。

//this is a declaration
var foo;

//this is an assignment
bar = 3;

//this is a declaration and an assignment
var dual = 5;

声明设置DontDelete标志。任务不需要。

声明将该变量绑定到当前范围。

赋值但未声明的变量将查找要附加自身的作用域。这意味着它将遍历食物链范围,直到找到一个同名变量。如果没有找到,它将附加到顶级范围(通常称为全局范围)。

function example(){
  //is a member of the scope defined by the function example
  var foo;

  //this function is also part of the scope of the function example
  var bar = function(){
     foo = 12; // traverses scope and assigns example.foo to 12
  }
}

function something_different(){
     foo = 15; // traverses scope and assigns global.foo to 15
}

要清楚地描述正在发生的事情,请注意删除功能分析广泛地介绍了变量实例化和赋值。

用户回答回答于

var是可选的。var在本地范围内放置变量。如果定义变量时没有var,它在全球范围内。

在某个特定的环境中,在某个时间点上,不可拆的部分是正确的。

用户回答回答于

它不仅仅是本地的和全球的。创建的全局变量var与那些没有。考虑到这一点:

var foo = 1; // declared properly
bar = 2; // implied global
window.baz = 3; // global via window object

根据目前的答案,这些全局变量,foo,,,bar,和baz都是等价物。这是那个案子。全局变量var是否(正确)分配了内部[[DontDelete]]属性,使其不能被删除。

delete foo; // false
delete bar; // true
delete baz; // true

foo; // 1
bar; // ReferenceError
baz; // ReferenceError

所以你应该使用var,即使是全局变量。

用户回答回答于

带着myObj = 1;你使用的是全局变量。

后一个声明创建了一个局部变量,该变量位于你正在使用的范围内。

尝试使用以下代码来理解差异:

external = 5;
function firsttry() {
  var external = 6;
  alert("first Try: " + external);
}

function secondtry() {
  external = 7;
  alert("second Try: " + external);
}

alert(external); // Prints 5
firsttry(); // Prints 6
alert(external); // Prints 5
secondtry(); // Prints 7
alert(external); // Prints 7

第二个函数改变全局变量“外部”的值,但第一个函数没有。

用户回答回答于

这是Javascript的一个棘手部分,但也是它的核心特性之一。声明的变量var“开始它的生命”就在你声明的地方。如果你忽略了var,就像你说的是你以前用过的一个变量。

var foo = 'first time use';
foo = 'second time use';

关于范围,它是的确,变量自动成为全局变量。相反,Javascript将遍历作用域链,以查看你以前是否使用过该变量。如果它找到一个变量的实例,其名称与以前使用的相同,它将使用该实例以及在其中声明的任何范围。如果它在任何地方都没有遇到这个变量,它最终会碰到全局对象(window并将变量附加到浏览器中。

var foo = "I'm global";
var bar = "So am I";

function () {
    var foo = "I'm local, the previous 'foo' didn't notice a thing";
    var baz = "I'm local, too";

    function () {
        var foo = "I'm even more local, all three 'foos' have different values";
        baz = "I just changed 'baz' one scope higher, but it's still not global";
        bar = "I just changed the global 'bar' variable";
        xyz = "I just created a new global variable";
    }
}

当与嵌套函数和回调一起使用时,这种行为非常强大。了解什么functions在Javascript中,范围是最重要的。

所属标签

可能回答问题的人

  • 西风

    renzha.net · 站长 (已认证)

    7 粉丝1 提问9 回答
  • 四无君

    0 粉丝0 提问3 回答
  • o o

    3 粉丝490 提问2 回答
  • Dingda

    Dingda · 站长 (已认证)

    4 粉丝0 提问2 回答

扫码关注云+社区

领取腾讯云代金券