鍍金池/ 問答/HTML/ 參數(shù)變量是默認(rèn)聲明的,所以不能用let或const再次聲明,但是為什么可以使用v

參數(shù)變量是默認(rèn)聲明的,所以不能用let或const再次聲明,但是為什么可以使用var聲明?

正常情況下let或者const聲明的變量,是不能在重復(fù)聲明的,即使是使用var也會(huì)報(bào)錯(cuò),
eg:

let a = 123;
var a = 456;

錯(cuò)誤提示:Uncaught SyntaxError: Identifier 'a' has already been declared

const C = 123;
var C = 456;

錯(cuò)誤提示:Uncaught SyntaxError: Identifier 'a' has already been declared

參數(shù)變量是默認(rèn)聲明的,所以不能用let或const再次聲明,

但是為什么可以使用var聲明? 這里的默認(rèn)聲明是指什么?

eg:
函數(shù)內(nèi)使用var聲明參數(shù)

function foo(x = 5, y = function() { x = 2; }) {
  var x = 3;
  y();
  console.log(x);
}
foo()     // 不會(huì)報(bào)錯(cuò)

函數(shù)內(nèi)使用let聲明參數(shù)

function foo(x = 5, y = function() { x = 2; }) {

  let x = 3;
  y();
  console.log(x);
}
foo()     // 會(huì)報(bào)錯(cuò) Uncaught SyntaxError: Identifier 'x' has already been declared
回答
編輯回答
雅痞

Ecmascript 標(biāo)準(zhǔn)就是這樣定的。

2017年7月18日 14:03
編輯回答
離夢
//不報(bào)錯(cuò)
var a = "123";
var a = "321";

//報(bào)錯(cuò)
var a = "123";
let a = "321";
2017年6月16日 02:50
編輯回答
刮刮樂
function foo(x = 5, y = function () { x = 2; }) {
    let x = 3;
    // y();
    console.log(x);
}
foo();

即使函數(shù)不調(diào)用,結(jié)果也是一樣的。函數(shù)參數(shù)變量是默認(rèn)聲明的,所以不可以使用let和const再次聲明,其與第一種情況類似。
關(guān)于let和const的說明可以參考阮一峰e(cuò)s6中的函數(shù)的擴(kuò)展

2017年11月14日 02:18
編輯回答
毀與悔
function foo(x = 5, y = function() { x = 2; }) {

  let x = 3;
  y();
  console.log(x);
}
foo() 

這里報(bào)錯(cuò),我感覺應(yīng)該是函數(shù)聲明的提升,所以應(yīng)該他是先執(zhí)行了y(); 所以已經(jīng)注冊了一個(gè)x,后面再執(zhí)行l(wèi)et x=3的時(shí)候 ,就會(huì)報(bào)錯(cuò)。不知道 我的理解有沒有錯(cuò)。 他x的賦值應(yīng)該是 5 2 最后才是let x= 3中報(bào)錯(cuò)。

2017年2月17日 09:08