作用域有两种工作模型
1.词法作用域
2.动态作用域
查找
作用域查找会在找到第一个匹配的标识符时停止
无论函数在哪里被调用,也无论如何被调用,它的词法作用域都只由函数被声明时所处的位置决定。
运行时(欺骗)修改词法作用域 **(被严格模式影响-with被完全禁止,在保留核心功能的前提下间接或非安全地使用eval也被禁止)**
方法一:eval()
function foo(str,a){
eval( str );
console.log( a, b );
}
var b = 2;
foo("var b = 3;",1 ) //1,3
解释说明:当console.log(..)被执行时,会在foo(..)的内部同时找到a和b,但是永远也无法找到外部的b。
正常情况下,js的机制是函数作用域内找不到变量时会去外部查找。
类似的有setTimeout(..)和setInterval(..) [不提倡]
第一个参数可以是字符串,其内容可以被解释为一段动态生成的函数代码。
new function(..)
最后一个参数可以接受代码字符串,并将其转化为动态生成的函数。
语法略微安全一些 [尽量避免使用]
方法二:with关键字
with通常被当做重复引用同一个对象中的多个属性的快捷方式
var obj = {
a:1,
b:2,
c:3
};
//单调乏味的重复obj
obj.a = 2;
obj.b = 3;
obj.c = 4;
//简单的快捷方式
with(obj) {
a = 3;
b = 4;
c = 5;
}
网友评论