2014-11-03 168 views
0

有在線教程的一段代碼的JavaScript代碼示例無法運行

sayHi(1); 

function sayHi(x); { 
alert(x);   // 1 
[].shift.call(arguments); 
alert(x);   // undefined, no x any more :/ 
} 

在教程中,它說:

陣列的方法,其修改的參數也修改本地參數。

實際上,現代的ECMA-262 5th規範將局部變量的參數分開。但截至目前,瀏覽器仍然像上面描述的那樣。試試看例子。

通常,不修改參數是一個好習慣。

但我試着運行上面的代碼,它輸出警報1兩次而不是1和未定義。

http://javascript.info/tutorial/arguments

任何人都可以請你澄清一下嗎?謝謝

+0

'Uncaught SyntaxError:Unexpected token]' – 2014-11-03 11:06:16

+0

@James,I added;但它提醒1兩次而不是1,並且未定義。 – bean 2014-11-03 11:08:58

+3

該教程是垃圾。我可以通過警告的使用和缺少分號來判斷。有關更多JavaScript資源,請參閱MDN。 – 2014-11-03 11:09:11

回答

2

作爲destroy pointed out,您得到語法錯誤的原因是(自動分號插入無法正確糾正代碼),顯式添加分號很重要。

但約的x行爲主場迎戰arguments僞數組問題的肉:

在鬆散模式(默認),還有就是命名參數和arguments僞陣列之間的聯繫。下面是鏈接的一個更好的示範:

function foo(x) { 
 
    snippet.log(x);   // "one" 
 
    snippet.log(arguments[0]); // also "one" 
 
    x = "two"; 
 
    snippet.log(x);   // "two" 
 
    snippet.log(arguments[0]); // also "two" 
 
    arguments[0] = "three"; 
 
    snippet.log(x);   // "three" 
 
    snippet.log(arguments[0]); // also "three" 
 
} 
 
foo("one");
<!-- Provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 --> 
 
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

瞭解如何arguments[0]x基本上是相互的同義詞。

您參考教程似乎相信轉移arguments僞陣列(除去第一項)將使xundefined因爲arguments[0]undefined在這一點上。雖然這將對名稱爲xarguments僞陣列之間的鏈接進行合理解釋,但在Chrome的V8,Firefox的SpiderMonkey,IE11的JScript甚至IE8的較舊版本的JScript上都不是這樣。

在嚴格的模式下,命名參數和arguments僞陣列之間的鏈接不存在:

function foo(x) { 
 
    "use strict"; 
 

 
    snippet.log(x);   // "one" 
 
    snippet.log(arguments[0]); // also "one" 
 
    x = "two"; 
 
    snippet.log(x);   // "two" 
 
    snippet.log(arguments[0]); // "one" again, it wasn't changed 
 
    arguments[0] = "three"; 
 
    snippet.log(x);   // "two" again, it wasn't changed 
 
    snippet.log(arguments[0]); // "three" 
 
} 
 
foo("one");
<!-- Provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 --> 
 
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

在一般情況下,最好使用嚴格模式,並即使在鬆散模式代碼中也不依賴鏈接。

2

你簡單地忘記了分號。更改

alert(x) 

alert(x); 

小心分號:是的,有分號插入使大部分可選的,但規則是這麼辛苦,你要真寫了一大半。 Read more

關於修改arguments,你根本不應該這樣做。其中一個原因是the behavior isn't the same when you're in strict mode,要確保你不是在嚴格模式下並不容易,因爲你的代碼可能與另一個代碼串聯在一起。您鏈接的錯誤和過時的教程中提到的行爲已經過很長時間了。

+0

*「......即使我添加了;對於每一行,代碼都不會像教程中的註釋那樣工作。」*但我猜他們一定是在錯誤的地方或什麼東西。 – 2014-11-03 11:08:03

+0

-1。沒有足夠的jQuery。 – 2014-11-03 12:08:40

+0

@ZbigniewWiadro:不是一個有效的downvote原因。 +1,很好的回答。淨收益:'+ 8'。 – Cerbrus 2014-11-03 12:16:40