首页 > 试题广场 >

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

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


  • 2、undefined
  • 报错、报错
  • 2、报错
  • undefined、undefined
函数的参数后面用等号(=),可以为参数赋一个默认值
执行f(2),2作为函数的参数,忽略参数的默认值(即使括号中的 x = x 有错误),输出2
执行f(),因为函数的参数变量是默认声明的,括号中的 x = x 相当于 let x = x,导致错误:Cannot access 'x' before initialization,初始化之前无法访问'x'(注意,错误信息不是 x is not defined)

------ 解释一下 let x = x 为什么会报错 ------
① 先从一个简单的例子说起:a、b均未声明,将a赋值给b

报错,a未定义
为什么错误不是b未定义呢?因为b = a 这行代码涉及两个操作:检测a,对b赋值。而这两个操作的顺序是先检测a,确定a的使用没有问题,再将其赋值给b。所以在检测到a没有定义时,抛出错误,虽然对b赋值的操作也有问题,但执行顺序是在检测a的后面。
② 再分析一下 Cannot access 'x' before initialization(初始化之前无法访问'x')错误信息的出现原因
由于let声明的变量不会被提升,在声明之前引用后面才声明的变量,即“先引用,后声明”,就会抛出这个错误。
③ 回到题目,let x = x,涉及两个操作:检测x(先),声明x并赋值(后)。检测x时,发现x并未定义,但后面却有x的声明操作,即“先引用,后声明”,所以导致 Cannot access 'x' before initialization 的错误。
编辑于 2022-03-02 10:42:16 回复(6)
考点一:参数的默认值
函数的参数后面用等号(=),可以为参数赋一个默认值
执行f(2),2作为函数的参数,忽略参数的默认值(即使括号中的 x = x 有错误),输出2


考点二:暂时性死区
ES6 明确规定,如果区块中存在letconst命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。
// 报错
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)


发表于 2022-01-04 13:43:15 回复(0)
同事写这样的代码,我高低整两句
编辑于 2022-07-01 10:21:24 回复(0)
x=x相当于let x=x
发表于 2022-04-06 11:41:13 回复(0)
ECMAScript6可以用箭头"=>"定义函数。x => x * x(x) => {return x * x;}与匿名函数function(x){return x * x;}相等。
匿名函数(Lambda表达式)与箭头函数详解:
编辑于 2021-12-14 19:47:10 回复(0)
暂时性死区
发表于 2024-02-03 00:04:45 回复(0)
x = x 相当于 let x = x
发表于 2022-12-01 10:28:11 回复(0)