一.声明
1.变量声明
|
var |
声明了未赋值为undefined |
可以重复声明 |
可以重复赋值 |
|
let |
声明了未赋值为undefined |
不可以重复声明 |
可以重复赋值 |
|
const |
声明了就得赋值 |
不可以重复声明 |
不可以重复赋值 |
2.函数声明
|
声明式:function fun(){}; |
|
函数表达式:var/let/const fun = function(){};相当于一个变量 |
3.同名的情况
let、const参与的声明不存在同名问题。
(1)变量和变量同名:var和var;var和函数表达式;函数表达式和函数表达式。
(2)函数与函数同名:声明式函数和声明式函数。
(3)变量和函数同名:var和声明式函数;声明式函数和函数表达式。
二. 作用域
作用域:变量和函数可以访问的范围。
全局作用域:无论是函数外还是函数内都能访问到。
局部作用域:只能在函数内访问,在函数外不能访问。
- 变量的作用域
(1)全局变量:
在函数外使用var声明的变量;
无论是函数内外都没有使用var声明就直接赋值的变量。a=1
(2)局部变量:在函数内使用var声明的变量。
- 函数的作用域
(1)全局函数:在函数外声明的函数。
(3)局部函数:在函数内声明的函数。
3. 作用域链:就是作用域之间的相互嵌套,在查找变量的时候,会先到当前作用域下查找,如果在当前作用域没有变量声明,就会一直往上一级作用域查找。
三.提升
提升:在真正执行js代码之前,还有一个操作叫做预解析,预解析操作会找到文件中所有的声明,并且使用合适的作用域将它们关联起来,变量和函数的声明会被提升到与其对应作用域的最顶端。
变量创建的过程:
var a = 1;
(1)声明及初始化赋值阶段(声明阶段):var a = undefined;
(2)真实赋值阶段(赋值赋值):a = 1。
1. 变量的提升
(1)使用var声明的变量只能提升声明阶段,赋值阶段还停留在原地。
(2)隐式声明的变量不会提升。a=1;
2. 函数的提升
(1)使用声明式函数创建的函数,声明及赋值阶段全都会被提升。
(2)使用函数表达式创建的函数只提升声明阶段,赋值阶段还停留在原地。
(3)当函数被声明在判断语句内部时,JS会将函数声明当成表达式(赋值声明),即不会提升
3. 变量和函数的同名提升情况
(1)变量和变量同名:var和var;var和函数表达式;函数表达式和函数表达式。会按顺序提升,结果取决于最后面的值。
(2)函数与函数同名:声明式函数和声明式函数。会按顺序提升,结果取决于最后面的值。
|
var a = 1; var a = function(){}; console.log(a) | var a; var a; a = 1; a = function(){}; console.log(a); |
(3)变量和函数同名:var和声明式函数;声明式函数和函数表达式。会按顺序提升,结果取决于变量是否有值,变量有值就取变量值,变量没值就取函数值。
|
var a=1; function a(){}; console.log(a); |
var a; function a(){}; a=1; console.log(a) |
全局作用域 |
局部作用域 |
提升 |
|
|
隐式声明的变量a=1; |
函数内、外 |
无 |
无 |
|
var |
函数外 |
函数内 |
提升声明部分 |
|
let |
无 |
{} |
无 |
|
const |
无 |
{} |
无 |
|
函数 |
函数外 |
函数内 |
声明式函数是整体提升;函数表达式提升声明部分 |
作用域贯穿整个步骤
第一步:找声明(是否符合声明规则,声明种类:var/声明式函数/函数表达式)
第二步:找提升(对应的提升规则,同名问题)
|
var a = 1; function b(){ a = 10; return; function a(){ console.log(a); } } b(); console.log(a); | |
fn(30); var fn = 10; function fn(fn){ console.log(fn); var fn = 20; console.log(fn); function fn(){ console.log(fn); } } console.log(fn); |
function fn(fn) { // var fn=30; function fn() { console.log(fn); } var fn; console.log(fn);//1function fn = 20; console.log(fn);//2 20 } var fn; fn(30); fn = 10; console.log(fn);//10 |
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/222553.html原文链接:https://javaforall.net
