专栏首页Czy‘s BlogJavaScript变量提升

JavaScript变量提升

JavaScript变量提升

每日更新前端基础,如果觉得不错,点个star吧 ? https://github.com/WindrunnerMax/EveryDay

JavaScript中变量声明与函数声明都会被提升到作用域顶部,优先级依次为:变量声明 函数声明 变量赋值

变量提升

var的变量提升

console.log(a); // undefined
var a = 1;
console.log(a); // 1
// console.log(b); // ReferenceError: b is not defined

为了显示ab的区别,打印了一下未声明的变量b,其抛出了一个ReferenceError异常,而a并未抛出异常,其实对a的定义并赋值类似于以下的操作,将a的声明提升到作用域最顶端,然后再执行赋值操作。

var a;
console.log(a); // undefined
a = 1;
console.log(a); // 1

let的变量提升

关于这个问题目前有所分歧,但在ES6的文档中出现了var/let hoisting字样,也就是说官方文档说明letvar一样,都存在变量提升,我觉得能够接受的说法是

let 的「创建」过程被提升了,但是初始化没有提升。  
var 的「创建」和「初始化」都被提升了。  
function 的「创建」「初始化」和「赋值」都被提升了。

js中无论哪种形式声明var,let,const,function,function*,class都会存在提升现象,不同的是,var,function,function*的声明会在提升时进行初始化赋值为 undefined,因此访问这些变量的时候,不会报ReferenceError异常,而使用let,const,class声明的变量,被提升后不会被初始化,这些变量所处的状态被称为temporal dead zone,此时如果访问这些变量会抛出ReferenceError异常,看上去就像没被提升一样。

https://blog.csdn.net/jolab/article/details/82466362
https://www.jianshu.com/p/0f49c88cf169
https://stackoverflow.com/questions/31219420/are-variables-declared-with-let-or-const-not-hoisted-in-es6

函数声明提升

函数声明会将声明与赋值都提前,也就是整个函数体都会被提升到作用域顶部

s(); // 1
function s(){
    console.log(1);
}

函数表达式只会提升变量的声明,本质上是变量提升并将一个匿名函数对象赋值给变量

console.log(s); // undefined
var s = function s(){
    console.log(1);
}
console.log(s);  // f s(){console.log(1);}

优先级

var s = function(){
    console.log(0);
}
function s(){
    console.log(1);
}
s(); // 0

其在JS引擎的执行的优先级是 变量声明 函数声明 变量赋值

var s; // 变量声明

function s(){ //函数声明
    console.log(1);
}

s = function(){ // 变量赋值
    console.log(0);
}

s(); // 0

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Js中Currying的应用

    柯里化Currying是把接受多个参数的函数变换成接受一个单一参数的函数,并且返回接受余下的参数且返回结果的新函数的技术,是函数式编程应用。

    WindrunnerMax
  • Thunk函数的使用

    编译器的求值策略通常分为传值调用以及传名调用,Thunk函数是应用于编译器的传名调用实现,往往是将参数放到一个临时函数之中,再将这个临时函数传入函数体,这个临时...

    WindrunnerMax
  • async/await剖析

    JavaScript是单线程的,为了避免同步阻塞可能会带来的一些负面影响,引入了异步非阻塞机制,而对于异步执行的解决方案从最早的回调函数,到ES6的Promis...

    WindrunnerMax
  • JavaScript学习笔记007-js的执行

    Mr. 柳上原
  • 从零开始学 Web 之 JavaScript(三)函数

    全局变量:在 script 使用 var 定义的变量(所有的 script 共享其全局性,js 里面没有块级作用域概念,只有全局作用域和局部作用域)。

    Daotin
  • 高阶函数和闭包

    函数也是一种数据类型,同样可以作为参数,传递给另外一个参数使用。最典型的就是作为回调函数。

    星辰_大海
  • 前端必备,25个最基本的JavaScript面试问题及答案

    1.使用 typeof bar === "object" 来确定 bar 是否是对象的潜在陷阱是什么?如何避免这个陷阱?

    用户5997198
  • 函数与作用域

    小胖
  • JavaScript学习总结(三)——闭包、IIFE、原型、函数与对象

    一、闭包(Closure) 1.1、闭包相关的问题 请在页面中放10个div,每个div中放入字母a-j,当点击每一个div时显示索引号,如第1个div显示0,...

    张果
  • JavaScript解析机制之变量提升

    在当前作用域下,JS 运行之前,会把带有 var 和 function 关键字的事先声明,并在内存中安排好。(这个过程也可以理解为变量提升)然后再从上到下执行 ...

    Leophen

扫码关注云+社区

领取腾讯云代金券