21传统浏览器端JavaScript在使用的时候存在的命名冲突和___两大问题?

使用传统浏览器端JavaScript时存在两个主要问题:名称和范围冲突。

命名冲突:在传统的JavaScript中,所有变量和函数的作用域都是全局的,这意味着如果在多个文本文件中定义相同的变量或函数名,就会发生命名错误。
这可能会导致变量或函数被覆盖,从而导致意外的结果和错误。

作用域问题:在传统的JavaScript中,作用域是基于函数的,而不是块级的。
这意味着变量的范围在声明的函数内,而不是在if语句和for循环等代码块内。
这很容易导致意外的变量共享和污染,从而导致意想不到的结果。
这两个问题在传统的浏览器端JavaScript中非常常见,并且容易出错且难以调试。
为了解决这些问题,现代JavaScript在块级别引入了作用域和模块化的概念,使用let和const关键字来声明变量,并使用模块化的方法来组织和管理代码,从而避免了名称冲突和作用域问题。

【温故而知新】JavaScript作用域/作用域链

JavaScript作为一种广泛使用的编程语言,在前端开发中发挥着核心作用。
它允许开发人员动态生成网页内容,响应用户交互并发送/接收数据,而无需预编译,并在运行时被解释和执行。
JavaScript的主要特征之一是范围的概念,它定义了变量的可访问范围。
作用域主要分为全局作用域和局部作用域。
全局作用域中的变量可以在整个程序中访问,而局部作用域中声明的变量仅在它们所在的函数中可见。
此外,JavaScript还具有块级作用域功能,即代码块中声明的变量只能在该块内访问。
当代码执行时,JavaScript通过作用域链搜索变量。
作用域链是一个存储所有可访问变量的列表,当在局部作用域中找不到所需的变量时,JavaScript将继续向上搜索,直到找到该变量或到达全局作用域。
默认情况下,在函数内部声明的变量是局部变量,在函数外部声明的变量是全局变量。
当函数内部使用var、let或const声明变量时,即使与外部变量同名,外部变量也不会被修改,而是会在函数中创建一个新变量。
本地范围。
作用域的概念对于变量访问和修改很重要,理解作用域的原理有助于编写高质量的JavaScript代码。
下面是一个简单的JavaScript作用域示例,显示了对全局变量和局部变量的访问。
javascriptletglobalVariable="我是一个全局变量";functionfoo(){letlocalVariable="我是一个局部变量";console.log(localVariable);//输出:我是一个局部变量console.log(globalVariable);//输出:我是一个全局变量}foo();console.log(localVariable);//报错:ReferenceError:localVariableisnotdefineconsole.log(globalVariable);//输出:我是一个全局变量这种情况说明可以访问全局变量在整个计划中,同时仅局部变量仅限于内部访问函数。
作用域链概念进一步解释了变量查找规则。
当尝试访问变量时,JavaScript引擎会按作用域链顺序搜索变量的值,直到找到变量或到达全局作用域。
考虑以下作用域链示例,显示变量访问过程:javascriptfunctionfoo(){letlocalVariable="Iamalocalvariable";log(globalVariable);//输出:我是一个全局变量}console.log(globalVariable);//输出:我是一个全局变量}foo();在父作用域(函数“foo”)中查找“localVariable”,最后在全局作用域中查找“globalVariable”。
尝试在全局范围之外访问“localVariable”和“innerVariable”将导致错误,因为它们不在当前范围内。
了解作用域链的工作原理对于解决JavaScript中的常见作用域问题至关重要。
常见的范围问题包括变量访问错误、生命周期管理不善等。
正确处理块级作用域(如`let`和`const`关键字)、避免全局变量的污染以及合理使用闭包可以提高代码质量和稳定性。

学废了,JavaScript中的作用域与作用域链

范围定义变量的可见性或可访问性。
JavaScript中存在三种类型的作用域。
全局范围:在最外层定义的变量在全局范围内。
全局范围内的变量可以在程序中的任何位置访问。
函数作用域(局部作用域)(FunctionScope):函数内定义的变量属于函数作用域,也称为局部作用域。
本地作用域中的变量只能在您自己的作用域内访问。
块作用域:ES6中引入了let和const,与var不同。
在前面的示例中,用大括号中的var定义的变量(包括纯大括号、if、while和for)位于全局范围内。
如果我们在大括号之间定义let和const,则该变量将位于块作用域中。
块作用域变量只能在其自己的作用域内访问。
let和const的区别在于const定义了一个常量,并且定义的值不能改变。
作用域链:当一个变量在当前作用域内找不到时,就会尝试寻找其外部作用域。
如果仍然找不到,它会继续向外搜索(它只会在外部搜索,不会在觊觎的兄弟姐妹等中搜索)。
不要看里面)。
这种链式搜索规则称为作用域链。
函数的作用域是定义时的作用域,而不是调用时的作用域。
如果找不到变量会发生什么?在非严格模式下,当您尝试为变量赋值时,如果找不到该变量,则会将其隐式声明为全局范围内的变量。
在非严格模式下,当你尝试使用变量的值时,即使找不到也会报错。
在严格模式下,无论赋值还是使用未声明的变量都会报错。
作用域的优点是在编写代码时不需要区分全局作用域、局部作用域和块作用域的概念。
请记住,花括号是一个范围,并且始终从内到外查找变量。
使用let命名变量并避免使用var以避免潜在的命名冲突。
了解作用域和作用域链对于避免程序中出现意外行为至关重要,尤其是在处理函数调用和变量引用时。
正确使用范围概念有助于提高代码的可读性和可维护性。
我们建议您在日常编程中积极实践这些原则,并了解它们如何影响程序执行。