js作用域和提升

js作用域和提升一 声明 1 变量声明 var 声明了未赋值为 undefined 可以重复声明 可以重复赋值 let 声明了未赋值为 undefined 不可以重复声明 可以重复赋值 const 声明了就得赋值 不可以重复声明 不可以重复赋值 2 函数声明

一.声明

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. 变量的作用域

(1)全局变量:

在函数外使用var声明的变量;

无论是函数内外都没有使用var声明就直接赋值的变量。a=1

(2)局部变量:在函数内使用var声明的变量。

  1. 函数的作用域

(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

(0)
上一篇 2026年3月17日 下午3:32
下一篇 2026年3月17日 下午3:32


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号