作为前端的入门学习者,作用域是最基础的核心知识点,是变量查找、声明规范的基础,很多入门学者的困惑:[找不到变量]、[赋值报错]、[let/var/const的区别]的问题,都是因为对作用域还不了解,这些根本都问题都是在作用域上。
今天我们就通过结合V8引擎执行原理,用通俗易懂的话把作用域给大家讲的明明白白,即使是初学者也能吃的轻松透彻!
不管是浏览器还是node.js,他们所使用的都是V8引擎,它会读取代码但不会第一时间执行,而是要先梳理,主要为三步[分词、解析、执行]。 1.分词:将代码拆分为一个一个的词法单元(例如 let、a、=、10) 2.解析/语法分析:将词法单元组成一个语法树AST(抽象语法树) 3.执行:根据AST生成代码并执行
而作用域,是V8引擎执行代码、查找变量时所遵循的规则,变量能被哪里访问、在哪里能生效。
JS中有三种作用域:
1.全局作用域: 最外层的作用域,不在任何函数、大括号 {} 中的变量/函数,都属于全局作用域。 特点:
js 体验AI代码助手 代码解读复制代码var a = 10;
function fool(){
//函数内可以直接访问全局变量
console.log(a);
}
fool()//输出:10
console.log(a)//输出:101.函数作用域: 函数内部创建的作用域,只能函数内部访问,函数外部不能直接访问。 特点:
js 体验AI代码助手 代码解读复制代码function fool(){
var a = 2;
console.log(a);//内部正常访问输出:2
}
fool();
console.log(a);//外部无法访问 报错3.块级作用域: 大括号 {} 内部 (if/for/while//单独{})配合let/const使用形成的作用域。 特点:
js 体验AI代码助手 代码解读复制代码if(true){
let a = 1;
var b = 2;
const c = 3;
}
console.log(a);//无法访问 报错
console.log(b);//输出:2
console.log(c);//无法访问 报错在 v8 的执行过程中,查找一个变量时,会先在当前作用域中查找,如果找不到,就会去外层作用域查找,直到找到全局作用域,还是找不到,就会报错。
看个例子就秒懂
js 体验AI代码助手 代码解读复制代码var a = 1;
function outer(){
//函数作用域外层
var b = 2;
function inter(){
//函数作用域内层
var c = 3;
console.log(c);//3(当前找到)
console.log(b);//2(外层找到)
console.log(a);//1(全局找到)
console.log(d);//报错(找不到)
}
inter();
}
outer();1.let + {} 会形成块级作用域 var没有块级作用域,let遇到{}就会形成块级作用域
js 体验AI代码助手 代码解读复制代码{
var a = 1;
}
console.log(a);//1(不报错)
{
let b = 2;
}
console.log(b);//报错2.let 不会带来声明提升
js 体验AI代码助手 代码解读复制代码console.log(a);//声明提升不报错
var a = 1;
console.log(b);//无声明提升 报错
let b = 2;3. const 声明的是常量,不能重新赋值
js 体验AI代码助手 代码解读复制代码const a = 1;
a = 5;//报错从代码块开始,到变量声明赋值之前,这个区域就是暂时性死区,在这个区域内访问变量会直接报错!
作用域类型 | 生成条件 | 访问规则 | 配合声明 |
|---|---|---|---|
全局作用域 | 代码最外层 | 全局可访问 | var/let/const |
函数作用域 | 函数内部 | 仅函数内可访问 | var/let/const |
块级作用域 | {} + let/const | 仅大括号内可访问 | let/const |
let/const + {})
let 生成块级作用域、无声明提升;const 声明常量不可重新赋值
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。