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

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

时间:2023-11-11 16:45:33浏览次数:41  
标签:let 变量 参数 报错 默认值 声明

针对以下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)

标签:let,变量,参数,报错,默认值,声明
From: https://www.cnblogs.com/longmo666/p/17826052.html

相关文章

  • 不依赖于cn.hutool.extra.servlet.ServletUtil,使用Spring其他方式实现文件下载的功能
     在JDK17下,如下代码引用了cn.hutool.extra.servlet包下的ServletUtil工具类的ServletUtil.write方法,执行时报”Cannotresolvemethod'write(jakarta.servlet.http.HttpServletResponse,java.io.File)'“BUG,download方法通过cn.hutool.extra.servlet.ServletUtil的方法来实现......
  • requestAnimationFrame虽然是异步函数,但是由于i是用let定义的,每一次都会生成一个块级
    以下代码执行后,console输出的信息是?for(leti=0;i<5;i++){requestAnimationFrame(()=>console.log(i));}01234requestAnimationFrame虽然是异步函数,但是由于i是用let定义的,每一次都会生成一个块级作用域,来把当前值和requestAnimationFrame放在这个作用域中......
  • let是es6中声明变量的方式,有自己的作用域块,可以放变量,所以let绑定for循环时,每个i都有
    for(leti=0;i<2;i++){setTimeout(function(){console.log(i)},100);}for(vari=0;i<2;i++){setTimeout(function(){console.log(i)},100);}问:控制台打印的结果是?0122①Js是单线程的,Settimeout是异步宏任务,所以代码执行遇到异步的,就......
  • 下列代码存在几个变量没有被回收?( )
    下列代码存在几个变量没有被回收?()vari=1;vari=2;varadd=function(){vari=0;returnfunction(){i++;console.log(i);}}();add();3个1:全局变量i不会被回收2:全局变量add不会被回收3:闭包引用的局部变量i不会被回收代码回收......
  • 【3.0】Go语言语法初识之变量
    【零】注释语法注释就是对代码的解释和说明,其目的就是让人们更加轻松的了解代码。注释是开发人员的一个重要的习惯。单行注释使用//开头多行注释使用/*开头*/结尾//package定义包名main包名packagemain//import引用库fmt库名import"fmt"//func定......
  • CompletableFuture 学习
    创建异步任务CompletableFuture创建异步任务,一般有supplyAsync和runAsync两个方法supplyAsync执行CompletableFuture任务,没有返回值//使用默认内置线程池ForkJoinPool.commonPool(),根据supplier构建执行任务publicstatic<U>CompletableFuture<U>supplyAsync(Suppli......
  • kubeadm部署的k8s证书过期问题 k8s问题排查:the existing bootstrap client certifica
     解决问题:估计跟移动有关,下面那个没解决问题,是因为在原有文件的基础上修改的吧?而这里直接是移走,重新生成了新的。不太清楚是不是这个原因。$cd/etc/kubernetes/pki/$mv{apiserver.crt,apiserver-etcd-client.key,apiserver-kubelet-client.crt,front-proxy-ca.crt,front......
  • JMeter进阶使用变量及BeanShell 预处理程序实现复杂调试
    JMeter进阶使用变量及BeanShell预处理程序实现复杂调试有一些测试需要做一些预处理程序才能做http请求,在JMeter下可以通过使用参数+BeanShell预处理程序加工后再发起请求即可。例oauth服务需要通过username,password,client_id,client_secret,grant_type进行请求,这里的密码涉及安......
  • 无涯教程-批处理 - Deleting from the Registry函数
    通过REGDEL命令从注册表中删除,请注意,为了从注册表中删除值,您需要在系统上具有足够的特权才能执行此操作。REGDELETE命令具有以下变体,在第二个版本中,将删除默认值,而在最后一个版本中,将删除指定键下的所有值。REGDELETE[ROOT\]RegKey/vValueName[/f]REGDELETE[ROOT......
  • 无涯教程-批处理 - Deleting Folders函数
    对于删除文件夹,批处理脚本提供了DEL命令。DEL[/P][/F][/S][/Q][/A[[:]attributes]]names以下是可以提供给DEL命令的选项的说明。S.No.Options&描述1.Names指定一个或多个文件或目录的列表,通配符可用于删除多个文件,如果指定了目录,则目录中的所有文件将被删除。2......