前端基础知识:javascript作用域
javascript中变量或函数产生作用、而不会对外产生影响的封闭空间。外部不可以访问内部变量或函数,但内部能够访问外部。
ES5:
- 全局作用域:所有地方都可以访问
- 函数作用域:只能在函数内部访问
ES6:
- 增加了块级作用域(最近大括号的作用范围),但仅限于let声明的变量
作用域链
规则:
- 全局变量,函数申明都是属于0级链,每个对象占一个位置
- 凡是看到函数就延伸一个链出来,一级级展开
- 访问首先看到当前函数,如果当前作用域链没有定义,往上级链中检查
- 如此往复,直到0级链,如果0级没有,则弹出错误,这个变量没有定义
词法作用域
所谓词法(代码)作用域,就是代码在编写过程中体现出来的作用范围,代码一旦写好了,没有运行之前(不用执行),作用范围就已经确定好了,这个就是所谓的词法作用域。
词法作用域的规则:
- 函数允许访问函数外部的数据
- 整个代码结构中只有函数才能限定作用域
- 作用规则首先使用变量提升规则分析
- 如果当前作用规则里面有该名字,则不考虑外面的外面的名字
词法作用域根据声明变量的位置来确定该变量可被访问的位置。嵌套函数可获取声明于外部作用域的函数。
function init() {
var name = "Mozilla"; // name 是一个被 init 创建的局部变量
function displayName() { // displayName() 是内部函数,一个闭包
alert(name); // 使用了父函数中声明的变量
}
displayName();
}
init();
var let 区别
- var声明的变量,只有函数才能为它创建新的作用域
let支持块级作用域,花括号就能为它创建新的作用域
- 相同作用域,var可以反复声明相同标识符的变量,而let是不允许的;
- let声明的变量禁止在声明前访问
// 全局变量
var i = 0 ;
// 定义外部函数
function outer(){
// 访问全局变量
console.log(i); // 0
function inner1(){
console.log(i); // 0
}
function inner2(){
console.log(i); // undefined
var i = 1;
console.log(i); // 1
}
inner1();
inner2();
console.log(i); // 0
}
THE END