我正在做一個測試,var i
在父函數和子函數循環中使用。在自己的循環中使用i的函數,以及子函數循環 - var的行爲如let?
這是我的代碼:
<html>
\t <head>
\t \t <script>
\t \t \t var gArr = ['a', 'b', 'c'];
\t \t \t function ix(a) {
\t \t \t \t for (var i = 0; i < gArr.length; i++) {
\t \t \t \t \t document.body.innerHTML += '<br> i from ix: ' + i;
\t \t \t \t \t if (gArr[i] == a) {
\t \t \t \t \t \t return a;
\t \t \t \t \t }
\t \t \t \t }
\t \t \t }
\t \t \t function blah(newAdds) {
\t \t \t \t for (var i = 0; i < newAdds.length; i++) {
\t \t \t \t \t document.body.innerHTML += '<br>i from blah: ' + i;
\t \t \t \t \t var cEntry = ix(newAdds[i]);
\t \t \t \t \t document.body.innerHTML += '<br> i from blah post ix: ' + i;
\t \t \t \t \t if (!cEntry) {
\t \t \t \t \t \t gArr.push(newAdds[i]);
\t \t \t \t \t }
\t \t \t \t }
\t \t \t }
\t \t \t window.onload = blah.bind(null, ['d', 'e']);
\t \t </script>
\t </head>
\t <body>
\t </body>
</html>
這段代碼的輸出是這樣的:
i from blah: 0
i from ix: 0
i from ix: 1
i from ix: 2
i from blah post ix: 0
i from blah: 1
i from ix: 0
i from ix: 1
i from ix: 2
i from ix: 3
i from blah post ix: 1
因爲函數ix
還採用var i
我期待的是,i from blah post ix
將被覆蓋爲的最後i
值這是3
在上述情況下。但事實並非如此。
這是預期的行爲?我以爲let
應該給我們這種行爲而不是var
?
[RTFM](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Grammar_and_types#Variable_scope) – hindmost
'var'變量限於它們的包含函數,因此兩個'i'在你的職責中是不同的。 – georg
@statemost:[STFU](http://stackoverflow.com/help/be-nice);) – georg