词法作用域
定义在词法阶段的作用域,最先时,编译器做语法剖析的时刻,确认js里各个词法地点的作用域。
js里只要全局作用域和函数作用域,这里简朴引见下js的作用域。
js作用域
看下面代码:
var a = 1;
var b = 0;
function foo() {
var a = 2;
console.log(a); //2
console.log(b); //0
}
foo();
console.log(a); //1
1、在foo函数里,在console.log(a),对a举行RHS查询,发明在当前作用域存在变量a,假如foo里没有a就往上一层(全局)去查找
2、在foo函数里,在console.log(b),对b举行RHS查询,发明在当前作用域不存在变量b,然后往上一层(全局)去查找b,发明存在变量b,猎取b的值。
在词法剖析阶段,会确认在全局作用域里有a,b这两个变量,函数foo作用域里有a这个变量
然则,有些要领能够诳骗或许动态天生作用域。
比方:eval、setTimeout、with等
eval
eval函数能够理解为在当前作用域插进去一段代码。
以下:
var b = 2;
function foo() {
eval('var b=1')
console.log(b); //1
}
foo();
console.log(b); //2
在最先的词法剖析中,foo函数作用域并不存在变量b,然而在引擎实行代码的时刻,到eval函数实行,就强行在foo函数作用域中插进去变量b
setTimeout
定时器函数是一个异步函数,第一个参数中字符串的实行作用域是全局作用域,相似上面动态插进去变量。
var b = 1;
function foo() {
setTimeout('var b =2', 0);
setTimeout('console.log(b)', 0); //2
}
foo();
console.log(b); //1
with
扩大一个语句的作用域链。
在一个对像是扩大属性,假如属性存在就修正属性值,假如不存在就挂载在全局对象上,相似于在函数里不必var声明的变量都挂在window对象上。