Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript变量是如何工作的?_Javascript_Variables_Scope_Var - Fatal编程技术网

JavaScript变量是如何工作的?

JavaScript变量是如何工作的?,javascript,variables,scope,var,Javascript,Variables,Scope,Var,我知道JavaScript变量指向一个值: var foo = true; //... later foo = false; 所以在这个例子中,我改变了foo指向true->foo指向false,但是如果我这样做了: for (var i=0; i<100; i++){ var someVar = i; } for(var i=0;iNo,没有区别;在JavaScript中,变量的作用域是函数级的,而不是块级的。正如@icktoofay所说,在JavaScript中没有区别。

我知道JavaScript变量指向一个值:

var foo = true;
//... later 
foo = false;
所以在这个例子中,我改变了
foo
指向
true
->
foo
指向
false
,但是如果我这样做了:

for (var i=0; i<100; i++){
    var someVar = i;
}

for(var i=0;iNo,没有区别;在JavaScript中,变量的作用域是函数级的,而不是块级的。

正如@icktoofay所说,在JavaScript中没有区别。在某些语言中,在每次迭代中,变量都会被实例化,然后超出作用域,然后被垃圾收集

要在javascript中模拟此情况,可以执行以下操作:

for (var i=0; i<100; i++){
    (function(){
        var myvar = i;
    })();
}

for(var i=0;iJavascript ES5和更早版本中没有块作用域,只有函数作用域。此外,函数作用域内声明的所有Javascript变量的声明都会自动“提升”到函数顶部

因此,在循环中声明变量与在函数顶部声明变量,然后在循环中引用变量没有什么不同

有关一些有用的解释,请参见以下两个参考资料:和

注意:不挂起对变量的赋值,只挂起对变量的声明。因此,如果您这样做:

function a() {
    for (var i=0; i<100; i++){
        var myvar = i;
    }
}

2015年更新。ES6(有时称为ES2015)提供了
let
声明,该声明确实提供了块作用域。在这种情况下,
let
变量声明仅提升到当前块作用域的顶部。截至2015年年中,该声明尚未在浏览器中广泛实现,但很快就会实现,并且在node.js等服务器端环境中或通过transpilers提供

因此,在ES6中,如果您这样做:

for (let i=0; i<100; i++){
    let someVar = i;
}
用于(让i=0;i之类的工具建议您将所有
var
语句放在函数的顶部。这是因为如果您不这样做,JavaScript基本上是为您做的,因此如果您这样做,就不会那么混乱了。在您的示例中,您将
var
放在哪里并不重要,只要它出现在
myvar
的一个定义之前当然,您也可以在函数顶部声明
i

更有趣的是层次化的作用域链,JavaScript在需要查找名称时在其中搜索名称。它从本地到全局搜索作用域链,直到找到所述名称的第一个实例

这就是为什么你可以玩这样的游戏来骚扰你的朋友:

function foofinder() {
    var bar = function () { return foo; },
        foo="beers";
    return bar();
}

foofinder();
>>> "beers"

通过不断在变量名之前声明
var
,可以指示JavaScript引擎或解释器将变量重新初始化为未定义的值(
undefined
,而不是数字、字符串/文本、布尔值或
null
)在赋值之前,这将是额外的指令,降低循环执行的速度。您还增加了代码大小,降低了代码解析/解释/编译的速度

实际上,对于任何应用程序来说,都没有功能上的差异,但仍然有一个差异,并且在几十万次或几十亿次循环执行之后,这种差异可能会很明显。但是,在一个函数中重复相同名称的VAR声明会导致Chrome/V8中出现致命的异常。

更新:在变量名之前使用
var
要比省略var慢得多,正如在Chrome/v8上使用JavaScript控制台运行的以下基准测试所示

var startTime = new Date().getTime();
var myvar;
for (var i=0; i<100000; i++){
    myvar = i;
}
console.log(new Date().getTime() - startTime);

var startTimx = new Date().getTime();
var myvax;
for (var j=0; j<100000; j++){
var myvax = j;
}
console.log(new Date().getTime() - startTimx);
161
169
var startTime=new Date().getTime();
var-myvar;

对于(var i=0;i尽管这个答案看起来过于简单。这是绝对正确的。关键是这么简单。如果你想有效地使用Javascript,你必须理解函数作用域和块作用域,循环中的+1变量作用域在连续迭代中不会改变。这个答案和你对它的支持都是不正确的。有一个区别,虽然它是微妙的,不应该改变任何脚本的执行。我在下面详细介绍了它。没有“var语句”。有一个变量声明,它以关键字var开头。短语
将var放在何处并不重要,只要它出现在myvar的一个定义之前,对我来说就没有意义了。声明在执行任何代码之前进行处理,因此您可以在对它们进行赋值的下面声明变量(尽管这样做可能会让人困惑),它们的范围仍将由声明控制。一些古老的资源将
var
的使用称为“
var
语句”。其中一个资源是(在页面上搜索“var语句”)虽然
var
关键字确实用于变量声明,但为了方便起见,您当然可以在同一表达式中定义变量。如果您在同一范围内定义并重新定义变量,则可以将
var
关键字放在这些定义的任何一个之前,以达到相同的效果。检查时,确实存在变量bleStatement(ECMA-262§12.2),因此我接受更正。您的措辞(对我而言)不清楚,我试图更正使情况更糟:-(为什么这个答案被否决了?很明显,在循环中反复声明变量是多余的吗?我怀疑当前的JavaScript实现是否会在循环中每次都将变量重置为未定义。从技术上讲,变量只在函数开始时声明一次。@Matthew Crumley,
var x=10;varx;
证实了你的观点。这是相关部分吗:?Daniel我已经从@katspaugh comment做了下面的测试,var x没有再次初始化,它仍然有10个值。我已经阅读了规范,它说:“如果
varalreadydecared
为假,那么”(Ecma-262,10.5),基本上,声明它并设置为
undefined
,以及no
else
-clause.Uhhh,这实际上并不执行任何操作。没有调用内部函数。也许您想创建
function a() {
    for (var i=0; i<100; i++){
        (function() {
            var myvar = i;
            // myvar is now a separate variable for each time through the for loop
        })();
    }
}
for (let i=0; i<100; i++){
    let someVar = i;
}
function foofinder() {
    var bar = function () { return foo; },
        foo="beers";
    return bar();
}

foofinder();
>>> "beers"
var startTime = new Date().getTime();
var myvar;
for (var i=0; i<100000; i++){
    myvar = i;
}
console.log(new Date().getTime() - startTime);

var startTimx = new Date().getTime();
var myvax;
for (var j=0; j<100000; j++){
var myvax = j;
}
console.log(new Date().getTime() - startTimx);
161
169