2、词法作用域

2019-01-25  本文已影响0人  daisx

词法作用域

简单地说,词法作用域就是定义在词法阶段的作用域。
换句话说,词法作用域是由你在写代码时将变量和块作用域写在哪里来决定的,因此当词法分析器处理代码时会保持作用域不变
词法作用域可以采取方法来进行欺骗操作,改变作用域,比如闭包


变量查找

引擎通过词法作用域中的各个变量的嵌套位置关系,来查找变量的正确信息。
作用域查找到第一个匹配元素就会停止查询。
遮蔽效应:多层嵌套中,外部作用域标识符会被内层作用域的同名标识符遮蔽


词法欺骗

eval()

接受一个字符串为参数,字符串是一段js代码,然后eval函数解析这段js代码并执行。

function foo(str, a) {
eval( str ); // 欺骗!
console.log( a, b );
}
var b = 2;
foo( "var b = 3;", 1 ); // 1, 3

foo函数执行以后,将var =3解析在了foo的作用域中,等于在函数作用域中追加了一个变量,并且遮蔽了全部的变量b,这样看起来就好像是对已经存在的foo函数作用域进行的认为的修改。


with

var obj = {
a: 1,
b: 2,
c: 3
};
//直接引用书写麻烦
obj.a = 2;
obj.b = 3;
obj.c = 4;
//with引用都就可以像使用变量一样引用对象属性
with (obj) {
a = 3;
b = 4;
c = 5;
console.log(a+b)  // 7,
}

建议

强烈不推荐使用 eval(..) 和 with

上一篇 下一篇

猜你喜欢

热点阅读