最近打算把js重新学一遍,毕竟秋招问的基础多一些~
不得不说,JavaScript真的神奇又深奥,需要慢慢体会哦,今天就来说说Js词法作用域,这个之前面试滴滴的时候被问过,不得不说这个还是很重要滴,虽然面试回答的并不好~
首先呢,先来了解一下词法化,大部分标准语言编译器的第一个工作阶段叫作词法化,也称为单词花,词法化的过程会对源代码中的字符进行检查,如果是有状态的解析过程,还会赋予单词语义。这个概念是理解词法作用域及其名称来历的基础~
不要害怕哦,不太懂没关系,简单的说,作用域是指程序源代码中定义变量的区域,作用域规定了如何查找变量,也就是确定当前执行代码对变量的访问权限,JavaScript采用词法作用域(lexical scoping),也就是所谓的静态作用域。词法作用域就是定义在词法阶段的作用域,换句话说,词法作用域是由你写代码时将变量和块作用域写在哪里决定的,因此当词法分析器处理代码时会保持作用域不变~
因为JavaScript采用的是词法作用域,就是静态作用域,说的简单一些,就是函数的作用域在函数定义的时候就决定了。有词法作用域,就有与之相对的动态作用域,所谓的动态作用域就是说函数的作用域是在函数调用的时候才决定的~
举个栗子~
var value = 1;
function foo() {
console.log(value);
}
function bar() {
var value = 2;
foo();
}
bar();
// 猜猜结果是什么?
- 假设JavaScript采用静态作用域,让我们分析下执行过程:
执行 foo 函数,先从 foo 函数内部查找是否有局部变量 value,如果没有,就根据书写的位置,查找上面一层的代码,也就是 value 等于 1,所以结果会打印 1。
- 假设JavaScript采用动态作用域,让我们来分析一下执行过程:
执行 foo 函数,依然是从 foo 函数内部查找是否有局部变量 value。如果没有,就从调用函数的作用域,也就是 bar 函数内部查找 value 变量,所以结果会打印 2。
不巧的是,JavaScript采用的是静态作用域,所以这个例子的结果是 1。
因为JavaScript采用的是词法作用域,函数的作用域基于函数创建的位置~
函数的作用域在函数定义的时候就决定了~ 要记住哦~