如何全面理解JavaScript中复杂的词法作用域机制及其应用场景?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1121个文字,预计阅读时间需要5分钟。
JavaScript并非传统的块级作用域,而是函数级作用域!一、作用域+JavaScript引擎在代码执行前会对代码进行编译,在这个过程中,像var a=2这样的声明会被分解成两个独立的步骤:第一步:声明var a;第二步:赋值a=2。
JavaScript并不是传统的块级作用域,而是函数作用域!
一、作用域
- JavaScript引擎在代码执行前会对其进行编译,在这个过程中,像var a = 2 这样的声明会被分解成两个独立的步骤:
第一步(编译阶段):var a 在其作用域中声明新变量。这会在最开始的阶段,也就是代码执行前进行。
第二步(运行阶段):a = 2 会查询变量a(LHS查询)并对其进行赋值。
- LHS & RHS(当前作用域->上级作用域->...->全局作用域)
LHS(左侧):试图找到变量的容器本身
RHS(右侧):查找某个变量的值
示例:
function foo(a){ var b = a; return a + b; } var c = foo(2); // LHS(3处):c;a(隐式变量分配);b; // RHS(4处):foo(2);=a;a;b;
- 异常
function foo(a){ console.log(a + b); b = a; } foo(2);
(1)在ES5“严格模式”下,LHS抛出ReferenceError;“非严格模式”下,LHS会自动隐式的创建一个全局变量。
本文共计1121个文字,预计阅读时间需要5分钟。
JavaScript并非传统的块级作用域,而是函数级作用域!一、作用域+JavaScript引擎在代码执行前会对代码进行编译,在这个过程中,像var a=2这样的声明会被分解成两个独立的步骤:第一步:声明var a;第二步:赋值a=2。
JavaScript并不是传统的块级作用域,而是函数作用域!
一、作用域
- JavaScript引擎在代码执行前会对其进行编译,在这个过程中,像var a = 2 这样的声明会被分解成两个独立的步骤:
第一步(编译阶段):var a 在其作用域中声明新变量。这会在最开始的阶段,也就是代码执行前进行。
第二步(运行阶段):a = 2 会查询变量a(LHS查询)并对其进行赋值。
- LHS & RHS(当前作用域->上级作用域->...->全局作用域)
LHS(左侧):试图找到变量的容器本身
RHS(右侧):查找某个变量的值
示例:
function foo(a){ var b = a; return a + b; } var c = foo(2); // LHS(3处):c;a(隐式变量分配);b; // RHS(4处):foo(2);=a;a;b;
- 异常
function foo(a){ console.log(a + b); b = a; } foo(2);
(1)在ES5“严格模式”下,LHS抛出ReferenceError;“非严格模式”下,LHS会自动隐式的创建一个全局变量。

