使用’var’声明变量是可选的吗?[重复]

2020/09/30 23:01 · javascript ·  · 0评论

“ var”是可选的吗?

myObj = 1;

和...一样 ?

var myObj = 1;

我发现它们都可以通过我的测试工作,我认为这var是可选的。那正确吗?

他们的意思不同。如果使用var变量,则在范围内声明变量(例如,在函数中)。如果不使用var,变量会在作用域的各个层中冒泡,直到遇到给定名称的变量或全局对象(如果在浏览器中是窗口,则为窗口),然后将变量附加到该变量。然后,它非常类似于全局变量。但是,仍然可以使用删除它delete(很可能是其他人的代码也未能使用var)。如果var在全局范围内使用,则该变量是真正的全局变量,无法删除。

在我看来,这是javascript最危险的问题之一,因此不建议使用,或者至少在警告时发出警告。原因是,很容易忘记,var并且偶然有一个绑定到全局对象的通用变量名。这会产生怪异且难以调试的行为。

这是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中最重要的事情。

不,它们不是等效的。

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

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

不仅限于本地vs全球,它还有更多的功能。使用创建的全局变量与var不使用创建的全局变量不同。考虑一下:

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

根据答案,到目前为止,这些全局变量,foobar,和baz都是等效的。这是不是这种情况。使用var(正确)分配了使用进行的全局变量的内部[[DontDelete]]属性,因此不能删除它们。

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

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

这就是为什么即使对于全局变量也应始终使用的原因var

关于这个主题有太多的困惑,并且现有的答案都没有清楚,直接地涵盖所有内容。以下是一些带有内联注释的示例。

//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在全局范围内且不可删除

编辑

我认为在某些环境中的某个时间点,不可删除部分是正确的。我一定梦到了。

看看这个小提琴: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

它们是不相同的。

未声明的变量(不带var)被视为全局对象的属性。(通常是window对象,除非您处于with障碍中)

用声明的变量var是普通的局部变量,在声明它们的函数之外不可见。(请注意,Javascript没有块作用域)

更新:ECMAScript 2015

let是ECMAScript 2015中引入的,具有块作用域

Javascript中的var关键字是有目的的。

如果声明不带var关键字的变量,如下所示:

myVar = 100;

它成为一个全局变量,可以从脚本的任何部分进行访问。如果您没有故意或不知道它,如果在JavaScript的另一个位置重用变量名,可能会使您感到痛苦。

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

var myVar = 100;

它是作用域({}-大括号,函数,文件,取决于放置位置)的局部范围。

这是处理变量的更安全的方法。因此,除非您故意这样做,否则请尝试使用var关键字声明变量,而不是没有声明。

考虑今天在StackOverflow上提出的以下问题:

简单的Javascript问题

在上述情况下会发生一个好的测试和一个实际的例子

。开发人员在其变量之一中使用了JavaScript函数的名称。

代码有什么问题?

该代码仅在用户第一次单击按钮时起作用。

有什么解决方案?在变量名称之前

添加
var关键字。

程序员不允许Var声明变量,因为Javascript没有变量。JavaScript有对象。Var显式声明一个未定义对象的名称。分配将名称分配给已为其赋予值的对象的句柄。

使用var告诉Javacript解释器两件事:

  1. 不要使用 委托反向遍历查找值作为名称,而是使用此值
  2. 不删除名字

省略var告诉Javacript解释器使用名称相同的对象的第一个找到的先前实例。

关键字Var是由语言设计者的错误决定引起的,其产生方式与Javascript作为名称是由错误的决定引起的一样。

ps。研究上面的代码示例。

除了范围之外的所有内容,它们的用法都可以不同。

console.out(var myObj=1);
//SyntaxError: Unexpected token var
console.out(myObj=1);
//1

一些东西陈述与表达

不,它不是“必需”的,但如果不是这样的话,也可能会导致重大问题。不使用var定义变量,则将该变量放入其所在的代码部分的范围内。如果不这样,则该变量不包含在该范围内,并且可以覆盖该范围之外具有相同名称的先前定义的变量您正在使用的功能。

我刚从我的一位同事推荐的论坛中找到答案。如果在函数外部声明变量,则该变量始终是全局的。无论您是否使用var关键字。但是,如果在函数内部声明变量,则有很大的不同。在函数内部,如果使用var关键字声明变量,则该变量将是局部变量,但是如果不使用var关键字声明变量,则该变量将是全局变量。它可以覆盖您先前声明的变量。-有关更多信息,请参见:http : //forum.webdeveloperszone.com/question/what-is-the-difference-between-using-var-keyword-or-not-using-var-during-variable-declaration/#sthash。 xNnLrwc3.dpuf

本文地址:http://javascript.askforanswer.com/shiyongvarshengmingbianliangshikexuandemazhongfu.html
文章标签:
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!