首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么我不能在Chrome中声明一个与函数体同名的let变量

在Chrome中声明一个与函数体同名的let变量是因为在JavaScript中,函数体被视为一个块级作用域,而let关键字用于声明块级作用域的变量。在同一个作用域中,不允许存在同名的变量和函数。

如果在Chrome中尝试声明一个与函数体同名的let变量,会导致语法错误。这是因为函数体的名称已经被函数定义占用,而let关键字要求变量名称在同一作用域中是唯一的。

为了避免这种冲突,建议在编写代码时遵循良好的命名规范,确保变量和函数的名称具有清晰的语义,并且不会产生命名冲突。此外,可以使用不同的作用域或命名空间来隔离变量和函数,以确保代码的可读性和可维护性。

腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

7 个令人惊讶 JavaScript “特性”

从未见过 label 被使用在 JavaScript 想知道为什么 —— 想可能因为如果需要 break 两层,说明把这个代码块放在一个函数里可能更好,这样可以使用一个单层 break...貌似 ES3 你可以添加一个小括号到一个简单赋值语句左边变量上,而这样写不会有问题: var a; (a) = 1; assertTrue(a === 1); 如果你能想到为什么这样写可以,请在底下评论...解构过程是一个变量一个数组或者一个对象拉取出来过程。..."); } 函数表达式与此相反,因为赋值一个变量时候,变量声明被提升,但是具体赋值没有被提升。...在 JSHint 作用域管理必须记录一个变量用法,如果它使用 let或者 const 声明于当前块级作用域或者它父级作用域,提前访问就会有引用错误。

41120

ES6 参数默认值引起中间作用域

如果在同一作用域中用 let 重复声明一个变量,则确实会报错,但是根据上面的分析,这里其实是不同两个作用域,按道理说不应该报错。为什么会报错呢?...因为如果不报错,让开发者重复声明一个变量,那么在函数作用域内,实参将难以获取(事实上我们依然可以通过参数作用域里函数返回这个实参,但这不是我们希望访问方式)。因此这里报错是一种合理设计。...说实话,这个问题暂时没有找到比较好解释,只能说可能是由于上面的 Error 是针对 let 声明这种情况来说,因为 ES5 var 重复声明确实不会报错,在这里也一样不报错。...所以,函数 x 依然是 undefined(只声明,没赋值),不过我们知道,结果打印是 2,预想相反。...意思是说,参数同名 var 变量在初始时候会具有一个对应参数相同值。在这个例子函数 x 值将会和参数默认值一样,为 2。

51330

把99%程序员烤得外焦里嫩JavaScript面试题

这就是执行级代码块作用域提升。如果在块外有同名符号,需要注意下面描述情况: 符号只有用var定义变量函数可以被覆盖,类和用let、const定义变量不能被覆盖,会出现重复声明异常。...这说明用let声明变量已经被锁死在顶层作用域中,不可被其他作用域变量替换。如果将let a = 14注释掉,会抛出如下图异常: ?...那么p1类肯定是在第1遍处理了,只是处理方法函数不同,只是将p1类作为符号保存到符号表,在使用p1类时并没有检测当前作用域符号表,因此,只能在使用类前定义这个类。...而且变量a用var声明,就说明这是hello函数局部变量,而函数a已经在第1遍扫描获得了,所以在执行到var a = 99时,js解析器已经知道了函数a存在,由于变量a和函数a都在同一个作用域,所以可以覆盖...// 输出10 好了,现在大家清楚为什么最开始给出两段代码,一个修改了全局变量a,一个没修改全局变量a原因了吧。

47320

C++变量存储说明符和cv-限定符

register修饰变量将创建一个寄存器变量,理念在于CPU访问寄存器值比访问普通存储在堆栈值速度要快,声明方法: register int count_fast; 需要注意是,编译器并不一定会满足将变量放在寄存器要求...要注意静态变量使用范围: int global = 1000;// 在函数声明,文件内外皆可使用 // 此时如果其他文件还想创建global同名变量,要么用extern声明(此时用还是同一个,共享了变量...(int n) { static int count = 0;// 在函数内用static声明,只能在函数内使用,但是无论函数是否执行,变量都存在,且多次调用时其值不会重新初始化,而是保持上一次结果...int lama = 0;// 普通变量,只能在函数内使用,函数执行就不会存在 } 函数内创建外部静态变量同名变量时,将使用自己创建,但是可以用::操作符表示使用外部: int global...,假设文件1声明一个外部变量,文件2要使用它,必须使用extern来修饰,因为不能创建两个同名外部变量,如上文所述。

58310

React 语法之let和const命令

// 6 上面代码变量i是let声明,当前i只在本轮循环有效,所以每一次循环i其实都是一个变量,所以最后输出是6。...函数能不能在块级作用域之中声明,是一个相当令人混淆问题。...ES5规定,函数能在顶层作用域和函数作用域之中声明,不能在块级作用域声明。...为了减轻因此产生兼容问题,ES6在附录B里面规定,浏览器实现可以遵守上面的规定,有自己行为方式。 允许在块级作用域内声明函数。...注意,上面三条规则只对ES6浏览器实现有效,其他环境实现不用遵守,还是将块级作用域函数声明当作let处理。 前面那段代码,在Chrome环境下运行会报错。

6.3K60

简单说说ES6新特性

◆ 1、声明变量  首先说说在没有es6之前存在问题,也就是var问题 可以重复定义 无法限制修改,有些东西不会变化,没常量 没有块级作用域,只有函数作用域 变量提示带来混乱   es6新增了两个声明变量关键字...(a); //undefined var a =1; (3)不可以在相同作用域内重复声明一个变量,也包括不能和var,const变量名重复 let a = 1; let a = 1; //出错 let...let命令声明变量,则所在区块对该变量形成封闭作用域,也就是该变量无视外部同名变量。...而又因为不存在变量提升,所以在该区块,不能在声明前使用该变量。...不可以使用yield命令,因此箭头函数不能用作 Generator 函数。 上面四点,第一点尤其值得注意。this对象指向是可变,但是在箭头函数,它是固定

1K20

《前端实战》之变量提升,函数声明提升及变量作用域详解

之所以会写这篇文章,主要源于笔者在重构老项目的时候发现了一个bug,导致某个插件生效了,在review加search code加断点调试之后,发现了原因:一个同名变量将插件方法给覆盖了,ohmyGad...如果对暂时性死区或者对es6不太了解朋友可以参考另一篇文章: 一文快速掌握 es6+新特性及核心语法 对let和const以及es6新特性有详细介绍。...这个问题也是之前面试一些求职者过程错误高发区,这里隐藏着一个概念:函数声明提升优先级高于变量声明提升。...浏览器底层实现过程是这样:当js解析器在遇到函数声明时,会优先将其提升到定义顶部,其次再是var声明变量,这样就导致函数a被变量a给覆盖情况,所以最终将打印1。...4.函数参数作用域作用域链 作用域就是变量函数可访问范围,当代码在一个环境执行时,会创建变量对象一个作用域链(scope chain),来保证对执行环境有权访问变量函数顺序访问。

69710

块级作用域

第四层作用域无法读取第五层作用域内部变量。 内层作用域可以定义外层作用域同名变量。...块级作用域函数声明 ES5 规定,函数能在顶层作用域和函数作用域之中声明,不能在块级作用域声明。...因为块级作用域内声明函数类似于let,对作用域之外没有影响。但是,如果你真的在 ES6 浏览器运行一下上面的代码,是会报错,这是为什么呢?...为了减轻因此产生兼容问题,ES6 规定,浏览器实现可以遵守上面的规定,有自己行为方式 允许在块级作用域内声明函数函数声明类似于var,即会提升到全局作用域或函数作用域头部。...根据这三条规则,浏览器 ES6 环境,块级作用域内声明函数,行为类似于var声明变量。上面的例子实际运行代码如下。

34030

三、变量对象

在JavaScript,肯定不可避免需要声明变量函数,JS编译器是如何找到这些变量呢? 我们还得对执行上下文有一个进一步了解。...在变量对象函数名建立一个属性,属性值为指向该函数所在内存地址引用 三、检查当前上下文中变量声明,每找到一个变量声明,就在变量对象变量名建立一个属性,属性值为undefined 如果变量函数同名...,var声明变量函数同名,以函数为准 // 执行阶段 VO -> AO VO = { arguments: {...}, foo: 'Hello', bar: <bar reference...,全局上下文生命周期,程序生命周期一致,只要程序运行结束,比如关掉浏览器窗口,全局上下文就会一直存在。...其他所有的上下文环境,都能直接访问全局上下文属性。 let/const ES6,新增了使用let/const来声明变量想他们使用肯定难不倒大家。

52830

使用letconst定义变量场景

背景 在javaScript,定义变量一个非常常见操作,在Es5,通常使用var定义声明变量,而在Es6新增了let和const关键字,也是用于声明定义变量 那究竟在什么样情况下使用它们,解决自己开发过程当中定义变量一些困扰...函数内部 块(字符{}之间区域) 块级块级之间代码块是相互隔离,互不影响,如下所示 示例代码: function fn() { let n = 12; if(true) {...,外层作用域无法读取内层作用域变量 {{{{let name = 'itclanCoder'}}}} 内层作用域可以定义外层作用域同名变量,内部声明函数都不会影响到作用域外部 { let...,变量指向数据,而是指向数据所在地址,const命令只是保证变量名指向地址不变,并不保证该地址数据不变 因此,将一个对象声明为常量必须非常小心 const foo = {}; foo.data...let,const也能够节省内存空间,不会造成全局变量污染,必须得前置声明赋值,然后才能使用(暂存性死区) 对于变化变量,则使用let,而不改变定义变量,使用const声明,如:for循环,

99820

智能合约开发——TypeScript 基础(全)

在创建一个变量时候,也可以指定类型,直接给定一个值,这个时候 ts 会完成类型自动推导(跟go类似),这样就知道这个变量是什么值了,例如: let age = 11; 三、生成 js 文件 在 ts...,在之前已经做好约束了,最后箭头函数右侧则是函数。...,所以在此处设定了这个参数类型范围,接着有一个 Boolean 返回值,在函数给了一个变量 check 为 Boolean,初始值为 true,只要 arg 不存在那么久 fase 即可,最后返回...在此一定要注意,你既然声明了,那就必须要实现(若删除一个成员变量初始化),否则会报错: 运行结果如下: 八、类 8.1 类基本使用 在 ts 定义一个类方式很简单,使用 class...9.2 交叉类型同名函数参数 在同名函数参数同名但类型不同情况下可以理解为同时兼容于两个类型,例如: interface CCC { age: number; getVl(key

75810

编写高质量 JS 变量5种最佳做法

1.首选 const,再 let 使用const或let声明变量,两者之间主要区别是const变量需要一个初始值,并且一旦初始化就无法重新分配其值。...在其他情况下,如果必须在执行过程多次重新分配变量,则可以使用let声明。 2.最小化变量范围 变量存在于它们所创建作用域内。代码块和函数为const和let变量创建一个作用域。...但是,middle和middleItem变量只在while循环代码块中使用。所以为什么直接在while代码块声明这些变量呢?...假设我们有一个函数,该函数主体包含很多语句。...4.好命名意味着易于阅读 从良好变量命名众多规则区分出两个重要规则。 第一个很简单:使用驼峰命名为变量取名,并且在命名所有变量时保持一致。

57630

Javascript局部变量、全局变量详解var、let使用区别

前言 Javascript变量定义方式有以下三种方式: 1、直接定义变量,varlet均不写; a = 10; 2、使用var关键字定义变量 var a = 10; 3、使用let关键字定义变量...var声明全局变量和局部变量同名 我们建立一个文件test2.html,从中输入以下代码: //在函数外使用var关键字声明变量...变量提升 前面介绍已经知道:局部变量和全局变量同名时,局部变量会覆盖全局变量。...这是因为函数内有和全局变量同名局部变量,会覆盖掉全局变量,但是let关键字声明变量并没有提升机制,所以会报错。...小结 本文介绍了JavaScript局部变量和全局变量知识和var,let声明变量区别。给我们启示是如果浏览器支持let关键字,那么就尽量用let来避免变量提升机制等情况。

3K20

JavaScript 设计模式学习第四篇-ES6 可能遇到知识点

1. let、const 一个显而易见特性是 let 声明变量还可以更改,而 const 一般用来声明常量,声明之后就不能更改了: let foo = 1; const bar = 2; foo =...因为 i 变量是 var 命令声明,var 声明变量作用域是函数作用域,因此此时 i 变量是在全局范围内都有效,也就是说全局只有一个变量 i,每次循环只是修改同一个变量 i 值。...不允许重复声明 let、const命令是不允许重复声明一个变量: if (true) { let str; let str; // Uncaught SyntaxError...下面例子同名函数定义是等价: // 基础用法 const test1 = function (参数1, 参数2, …, 参数N) { 函数声明 } const test1 = (参数1, 参数2...} // 没有参数时,圆括号不能省略 const test3 = () => { 函数声明 } // 当函数只是 return 一个单一表达式时,可以省略花括号和 return 关键词 const

44810

var let 以及 const区别和用法(详解)

从上面for循环可以看出,设置变量那一部分是一个作用域,循环体内部是一个单独作用域。 2.let不允许重复声明 let 不允许在相同作用域内,重复声明一个变量。...因为函数形参在栈中会被解析成函数私有变量出现在其执行上下文中,let不允许重复定义。...不同层级作用域可以定义同名变量 es6允许在块级作用域下声明函数,在块级作用域外面不可引用 凡是有{}者都有块级作用域 ES6块级作用域必须有大括号 {} 如果没有{} js引擎认为不存在块级作用域...只声明赋值,会报错(注意:var let声明赋值 : undefined) 不能重新赋值const定义值,但是可以修改const’声明对象类型。...let命令相同,只在声明所在块级作用域内有效 const声明变量也不存在变量提升,同样存在暂时性死区,只能在声明位置后面使用 const声明常量和let一样不可重复声明 const和let最大区别

67100

深入理解Javacript从作用域作用域链开始

, 使之成为全局变量, 但是建议这么做,因为这可能会和其他变量名冲突,一方面如果我们再使用const或者let声明变量, 当命名发生冲突时会报错。...最常见就是函数作用域。 2.2.1 函数作用域 定义在函数变量就在函数作用域中。并且函数在每次调用时都有一个不同作用域。这意味着同名变量可以用在不同函数。...console.log("test外部:"+num); 注意点: 如果在函数定义变量时,如果添加var关键字,造成变量提升,这个变量成为一个全局变量。...函数申明优先级优于变量申明,且函数声明会连带定义一起被提升(这里变量不同) 接下来讲,在ES6引入块级作用域之后事!...2.2.2 块级作用域 ES6新增了let和const命令,可以用来创建块级作用域变量,使用let命令声明变量只在let命令所在代码块内有效。 let 声明语法 var 语法一致。

49920

浏览器工作原理 - 浏览器 JavaScript

当遇到第二个 showName 函数时,会继续存放,但是发现已经存在一个同名函数,此时,新来函数会将之前函数覆盖掉,变量环境对象 showName 函数内容被更新为新函数。...执行阶段,从变量环境对象查找函数,找到同名函数,执行新函数,输出 cellinlab。 所以,如果一段代码定义了两个同名函数,那么,最后生效是晚点定义函数。...在 ES6 之前,作用域只有两种: 全局作用域:其中内容在代码任何地方都能访问,其生命周期页面的生命周期相同,只要页面存在,其内容就存在; 函数作用域:在函数内部定义变量函数,并且定义变量或者函数能在函数内部被访问...,在编译阶段会被存放到 词法环境 函数作用域内部,通过 let 声明变量并没有被存放到词法环境 继续执行代码,当执行到代码块里面时: 当进入函数作用域块时,作用域块通过 let 声明变量...在 JavaScript ,根据词法作用域规则,内部函数总是可以访问其外部函数声明变量,当通过调用一个外部函数返回一个外部函数后,即使该外部函数已经执行结束,但是内部函数引用外部函数变量依然保存在内存

52030

【ES基础】let和作用域

你将会学到以下内容: let基本介绍 作用域介绍 作用域 全局作用域和函数作用域 块级作用域 var和let区别 重复定义变量问题 提升概念问题 let介绍 ES6引入了let,用let声明变量,...如果在函数内使用var声明变量,就是函数作用域查找,只能在函数内部进行访问,外部不能进行访问,如下段代码所示: var a = 12; // 全局作用域都能访问 function myFunction...因此使用var进行声明时,如果一不小心,你就会声明一个全局作用域变量,更糟糕情况还有可能污染一个同名变量,因此产生BUG就很难查找。...(i); }, 1000); } // 输出 0,1,2,3,4 由于块级作用域存在,每次循环,就会产生一个循环块级作用域,因此才会达到预期输出。...初学JavaScript同学,直觉上会认为编译器会由上到下一行行执行,其实并不正确,函数声明变量声明都会被提升(使用var声明变量let声明变量将不会被提升)。

78980
领券