x = x 相当于 let x = x ;使用let声明变量时,只要变量在还没有声明完成前使用,就会报错

发布时间 2023-11-11 16:44:12作者: 龙陌

针对以下f函数分别执行f(2)和f()会有怎样的结果?
f = (x = x) => x;

A
2、undefined
B
报错、报错
C
2、报错
D
undefined、undefined

正确答案:C

在(x = x) => x中的三个x都是指向相同的变量,并且当函数在尝试给x赋值时会访问第2个x,
如果是f()则此时由于变量x是未赋值的,因此它就如同let变量一样不可访问,从而触发异常,相反的就可以拿到这个值了

函数的参数后面用等号(=),可以为参数赋一个默认值

执行f(2),2作为函数的参数,忽略参数的默认值(即使括号中的 x = x 有错误),输出2

执行f(),因为函数的参数变量是默认声明的,括号中的 x = x 相当于 let x = x,导致错误:Cannot access 'x' before initialization,初始化之前无法访问'x'(注意,错误信息不是 x is not defined)

考点一:参数的默认值

函数的参数后面用等号(=),可以为参数赋一个默认值

执行f(2),2作为函数的参数,忽略参数的默认值(即使括号中的 x = x 有错误),输出2

考点二:暂时性死区

ES6 明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。

// 报错
let x = x;

// ReferenceError: x is not defined
上面代码报错,就是因为暂时性死区。使用let声明变量时,只要变量在还没有声明完成前使用,就会报错。上面这行就属于这个情况,在变量x的声明语句还没有执行完成前,就去取x的值,导致报错”x 未定义“。

暂时性死区知识点可访问:https://es6.ruanyifeng.com/#docs/let

执行f(),因为函数的参数变量是默认声明的,括号中的 x = x 相当于 let x = x,导致错误:Cannot access 'x' before initialization,初始化之前无法访问'x'(注意,错误信息不是 x is not defined)