你不知道的javascript读书笔记(上)------第二章 词法作用域

作用域有两种工作模型

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;

}

你可能感兴趣的:(你不知道的javascript读书笔记(上)------第二章 词法作用域)