浅谈javascript作用域

栏目: JavaScript · 发布时间: 4年前

内容简介:作用域负责收集并维护由所有声明的变量组成的集合,等待引擎的查找。可以看出'L'和'R'分别代表左侧和右侧,即赋值的左侧和右侧。赋值不只是查询失败会出现什么情况

理解作用域

作用域负责收集并维护由所有声明的变量组成的集合,等待引擎的查找。

var a = 2;
console.log(a);  // 2
console.log(b);  // ReferenceError: b is not defined
  1. var a = 2 可以分解为 var a; a = 2 。当遇到 var a 时,编译器会询问作用域是否存在变量 a 。如果存在,则忽略该声明,否则会在当前作用域的集合中声明一个新的变量 a
  2. 遇到 a = 2 时,引擎会询问当前作用域是否存在变量,如果未找到,则会继续在上级作用域查找。如果最终找到就会将2赋值给变量 a
  3. console.log(a) 时,引擎会去作用域中查找 a ,找到把结果返回,输出2, console.log(b) 时,引擎未在作用域查找到 b ,抛出异常。

LHS和RHS查询

可以看出'L'和'R'分别代表左侧和右侧,即赋值的左侧和右侧。赋值不只是 = 的赋值,函数参数的传递也是一种赋值操作。

var a = 2;  // LHS查询,a出现在赋值左侧
console.log(a);  // RHS查询, a出现在赋值右侧,将变量a赋值给参数

查询失败会出现什么情况

对于LHS查询 a = 2 若a未找到,在非严格模式下并不会报错,而变量 a 会被自动创建。而对于 RHS 来说,直接使用未声明的变量就会报 ReferenceError。

console.log(b);  // ReferenceError: b is not defined

词法作用域

作用域主要有两种工作模型:词法作用域和动态作用域。

词法作用域就是定义在词法阶段的作用域。换句话说,词法作用域是由你写代码时变量和块作用域写在哪决定的。

function foo(a) {
    var b = a * 2;
    function bar(a) {
        console.log(a, b, c);
    }
    bar(b*3);
}
foo(2);

在这个例子有三个逐级嵌套的作用域。

  1. 全局作用域,包含一个标识符:foo
  2. foo所创建的作用域,包含三个标识符:a, bar, b
  3. bar所创建的作用域,包含一个标识符:c

函数作用域

函数作用域是指属于这个函数的变量都可以在整个函数范围内使用和复用。

function fn() {
    var a = 2;
    console.log(a);  // 2
}

console.log(a); // ReferenceError: a is not defined

从中可以看出,函数外部将无法访问函数内部的变量。

块作用域

ES6引入 letconst 将变量绑定到所在块作用域(通常是{...}内部)

{
    let a = 2;
    console.log(a);  // 2
}
console.log(a);  // ReferenceError: a is not defined

letconst 外, withtry/catchcatch 分句会创建一个块作用域。

小结

函数是Javascript中最常见的作用域单元。但函数不是唯一的作用域单元。块作用域属于某个代码块(通常指{...}内部)。

接下来会讲解提升和闭包两个概念。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

程序员的职业素养

程序员的职业素养

Robert C.Martin / 章显洲、余晟 / 人民邮电出版社 / 2012-9-1 / 49.00元

本书是编程大师Bob 大叔40 余年编程生涯的心得体会, 讲解成为真正专业的程序员需要什么样的态度、原则,需要采取什么样的行动。作者以自己以及身边的同事走过的弯路、犯过的错误为例,意在为后来人引路,助其职业生涯迈上更高台阶。 本书适合所有程序员,也可供所有想成为具备职业素养的职场人士参考。一起来看看 《程序员的职业素养》 这本书的介绍吧!

URL 编码/解码
URL 编码/解码

URL 编码/解码

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具