javascript中变量的范围是什么?它们在函数内部的作用域与在函数外部的作用域相同吗?或者这有关系吗?此外,如果变量是全局定义的,那么变量存储在哪里?
当前回答
据我理解,关键是Javascript具有函数级作用域,而不是更常见的C块作用域。
这是一篇关于这个主题的好文章。
其他回答
JavaScript中有两种类型的作用域。
全局范围:在全局范围中宣布的变量可以在程序中的任何地方非常流畅地使用。例如:var carName=“BMW”;//这里的代码可以使用carName函数myFunction(){//这里的代码可以使用carName}函数作用域或局部作用域:在此作用域中声明的变量只能在其自身的函数中使用。例如://这里的代码不能使用carName函数myFunction(){var carName=“BMW”;//这里的代码可以使用carName}
全局声明的变量具有全局范围。在函数中声明的变量的作用域是该函数,并隐藏同名的全局变量。
(我相信真正的JavaScript程序员可以在其他答案中指出许多微妙之处。特别是我在这个页面上看到了这到底意味着什么。不过,希望这个更为介绍性的链接足以让你开始。)
据我理解,关键是Javascript具有函数级作用域,而不是更常见的C块作用域。
这是一篇关于这个主题的好文章。
现代J、ES6+、“const”和“let”
您应该像大多数其他主要语言一样,为创建的每个变量使用块范围。var已过时。这使您的代码更安全,更易于维护。
95%的病例应使用常量。它使变量引用不能更改。数组、对象和DOM节点财产可以更改,并且应该是常量。
let应该用于任何期望重新分配的变量。这包括在for循环中。如果在初始化之后更改值,请使用let。
块范围意味着变量只能在声明它的括号内使用。这扩展到内部范围,包括在范围内创建的匿名函数。
为了补充其他答案,范围是所有声明的标识符(变量)的查找列表,并强制执行一组严格的规则,以确定当前执行的代码如何访问这些标识符。该查找可能用于分配变量,该变量是LHS(左侧)引用,也可能用于检索其值,该值是RHS(右侧)引用。这些查找是JavaScript引擎在编译和执行代码时在内部执行的操作。
因此,从这个角度来看,我认为我在凯尔·辛普森(Kyle Simpson)的《范围与关闭》(Scopes and Closures)电子书中找到的一张图片会有所帮助:
引用他的电子书:
该构建表示程序的嵌套范围规则集。第一个建筑物的楼层代表您当前执行的范围,无论你在哪里。建筑的顶层是全球范围。通过查看当前楼层来解析LHS和RHS参考,如果你找不到,就乘电梯到下一层,看那里,然后看下一个,以此类推。一旦你到达顶层(全球范围),你要么找到你想要的,要么不要。但你必须停止不管。
值得一提的是,“范围查找一旦找到第一个匹配项就停止”。
“作用域级别”的概念解释了如果在嵌套函数中查找“This”,为什么可以使用新创建的作用域来更改“This”。这里有一个链接,介绍了所有这些细节,您想了解的关于javascript范围的一切
推荐文章
- 我如何使用Jest模拟JavaScript的“窗口”对象?
- 我如何等待一个承诺完成之前返回一个函数的变量?
- 在JavaScript中根据键值查找和删除数组中的对象
- 使嵌套JavaScript对象平放/不平放的最快方法
- 如何以及为什么'a'['toUpperCase']()在JavaScript工作?
- 有Grunt生成index.html不同的设置
- 文档之间的区别。addEventListener和window。addEventListener?
- 如何检查动态附加的事件监听器是否存在?
- 如何从Python函数中返回两个值?
- 如何写setTimeout与参数Coffeescript
- 将JavaScript字符串中的多个空格替换为单个空格
- JavaScript: override alert()
- 重置setTimeout
- PowerShell:仅为单个命令设置环境变量
- 如何确保<select>表单字段被禁用时提交?