作用域

1、但是将变量引入程序会引起几个很有意思的问题,也正是我们将要讨论的:这些变量住在
哪里?换句话说,它们储存在哪里?最重要的是,程序需要时如何找到它们?

2、分词(tokenizing)和词法分析(Lexing)之间的区别是非常微妙、晦涩的,
主要差异在于词法单元的识别是通过 有状态 还是 无状态 的方式进行的。简
单来说,如果词法单元生成器在判断 a 是一个独立的词法单元还是其他词法
单元的一部分时,调用的是有状态的解析规则,那么这个过程就被称为 词法
分析 。

3、简单地说,任何 JavaScript 代码片段在执行前都要进行编译(通常就在执行前)。因此,
JavaScript 编译器首先会对 var a = 2; 这段程序进行编译,然后做好执行它的准备,并且
通常马上就会执行它

4、如果引擎最终找到了 a 变量,就会将 2 赋值给它。否则引擎就会举手示意并抛出一个异
常!
总结:变量的赋值操作会执行两个动作,首先编译器会在当前作用域中声明一个变量(如
果之前没有声明过),然后在运行时引擎会在作用域中查找该变量,如果能够找到就会对
它赋值。

 

5、考虑下面的程序,其中既有 LHS 也有 RHS 引用:
function foo(a) {
console.log( a ); // 2
}
foo( 2 );
最后一行 foo(..) 函数的调用需要对 foo 进行 RHS 引用,意味着“去找到 foo 的值,并把
它给我”。并且 (..) 意味着 foo 的值需要被执行,因此它最好真的是一个函数类型的值!
这里还有一个容易被忽略却非常重要的细节。

6、理解作用域的代码例子

function foo(a) {
var b = a;
return a + b;
}
var c = foo( 2 );

 

7、词法作用域

考虑以下代码:
function foo(a) {
var b = a * 2;
function bar(c) {
console.log( a, b, c );
}
bar( b * 3 );
}
foo( 2 ); // 2, 4, 12
在这个例子中有三个逐级嵌套的作用域。

 包含着整个全局作用域,其中只有一个标识符: foo 。
 包含着 foo 所创建的作用域,其中有三个标识符: a 、 bar 和 b 。
 包含着 bar 所创建的作用域,其中只有一个标识符: c 。

 

8、函数的作用域

考虑下面的代码:
function foo(a) {
var b = 2;
// 一些代码
function bar() {
// ...
}
函数作用域和块作用域 | 23
// 更多的代码
var c = 3;
}
在这个代码片段中, foo(..) 的作用域气泡中包含了标识符 a 、 b 、 c 和 bar 。无论标识符
声明出现在作用域中的何处,这个标识符所代表的变量或函数都将附属于所处作用域的气
泡。

 

但函数不是唯一的作用域单元。块作用域指的是变量和函数不仅可以属于所处的作用域,
也可以属于某个代码块(通常指 { .. } 内部)。

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值