javascirpt的作用域
作用域简单地来说就是一套良好的存取变量的规则
一、全局作用域
在全局作用域定义的变量,可以作为window(浏览器环境)或global(nodejs环境)的属性访问
很多场景下声明的全局变量是作为 多处使用的常量,在ECMAScript或commondjs模块环境中可以使用一个或一系列js文件来声明
二、函数作用域
function foo() { //函数作用域,可以嵌套 var a = 100 //外部无法访问 }
函数作用域可嵌套多层,如果不让函数名可以访问,可以使用立即执行函数:
(function foo(){ //函数作用域 var a = 100 })()
三、块作用域
1, try...catch中的catch声明的变量是在狂作用域(不建议使用)
try { bar() } catch (error) { //外部无法访问 console.log(error) var a = 100 } console.log(error) //报错, console.log(a) //报错
2. with语句(严格模式下禁止使用,不建议使用)
var obj = { a: 100 } with(obj) { a = 'hello' }
3. eval()函数(不建议使用)
4. 通过立即执行函数实现块作用域
5. 在es6中原生支持了块作用域
//打括号包含的代码块构成一个块作用域 { var a = 100. //外部无法访问 let b = 'hello' //外部无法访问 }