首页 > 其他分享 >变量提升与函数提升

变量提升与函数提升

时间:2024-11-11 23:44:13浏览次数:3  
标签:console log 提升 var 变量 函数

首先看一道计算题,你知道他的打印结果吗?

console.log(a);   
 var a=1;
 console.log(a); 
 getName();
 function getName(){
     console.log(a)   
     console.log(b)  
     a =2
     console.log(a)  
     var b=3
     console.log(b) 
     function b(){}
 }
结果为:        undefined
                1
                1
                b(){}
                2
                3
为什么要进行变量提升和函数提升?

JS引擎在读取js代码的过程中,分为两步。第一个步骤是整个js代码的解析读取,第二个步骤是执行。在JS代码执行之前,浏览器的解析器在遇到 var 变量名 和function 整个函数 提升到当前作用域的最前面。

在ES6出来之前,JS并没有块级作用域这一说,只有全局作用域和局部作用域。变量提升指的是使用var声明的变量提升到他所在的作用域的最顶端。

1.变量声明提升

  • 通过var定义(声明)的变量, 在定义语句之前就可以访问到
  • 值: undefined

2.函数声明提升

  • 通过function声明的函数, 在定义之前就可以直接调用
  • 值: 函数定义(对象)

3.问题: 变量提升和函数提升是如何产生的?

1.1 变量提升

console.log(a)   //undefined
var a='我是Lili'
console.log(a)   //'我是Lili'
它的过程就相当于
var a;
console.log(a);
a='我是Lili'
console.log(a)

1.2 函数提升
函数提升只针对具名函数(用function 声明的函数),而对于赋值的匿名函数,并不会存在函数提升。

console.log(a);    // f a()
console.log(b);    //undefined
function a(){
console.log('hello')
}
var b = function(){
    console.log('world')
}
它的过程就相当于:
var a = function (){
     console.log('hello')
}
var b;
console.log(a);
console.log(b);

1.3 变量提升与函数提升的优先级

函数提升优先级高于变量提升,且不会被同名变量声明覆盖,但是会被变量赋值后覆盖。而且存在同名函数与同名变量时,优先执行函数。
JavaScript中的函数是一等公民,函数声明的优先级最高,会被提升至当前作用域最顶端。如果前面的函数表达式与之前的函数声明同名,后者会将其覆盖。

比如:
console.log(a)   // ƒ a(){} 变量a赋值前打印的都会是函数a
var a=1;
function a(){}
console.log(a)   // 1 变量a赋值后打印的都会是变量a的值
首先变量和函数声明都提升,但函数提升优先级高于变量,都提升后变量只是定义没有赋值,所以输出的是函数a。详细过程如下:

function a(){} // 函数声明提升 a-> f a (){}
var a; // 变量提升
console.log(a) // 此时变量a只是声明没有赋值所以不会覆盖函数a --> 输出函数a f a (){}
a=1; //变量赋值
console.log(a) // 此时变量a赋值了 --> 输出变量a的值 1

总结:由于函数声明和变量都会提升,如果函数与变量同名,那么只要在变量赋值前打印的都会是函数,在变量赋值之后打印都是变量的值。

通过讲解现在看一下最上面的那道题的答案,现在明白为啥是那个结果了吗?欢迎探讨

标签:console,log,提升,var,变量,函数
From: https://blog.csdn.net/wuhhongjing88/article/details/143698283

相关文章

  • 工作学习笔记(六)变量命名规则
    在Java中,除了写注释来增加代码的可读性和维护性,还可以通过一些命名规则和约定来提高代码的可读性和维护性。变量命名规则的概述使用有意义的名字:变量名应该具有清晰的含义,能够准确地反映变量的用途。避免使用单个字符或无意义的缩写。小驼峰命名法:在变量名中使用驼峰命......
  • 细节解析 JavaScript 中 bind 函数的模拟实现
    大家的阅读是我发帖的动力,本文首发于我的博客:deerblog.gu-nami.com/,欢迎大家来玩,转载请注明出处喵。......
  • 数据库技术提升-MySQL数据库原理、设计与应用【1.9】
    4.4.4商品表商品分类与商品是一对多的联系,一个分类中有多件商品。商品表的具体结构如表4-14所示。在表4-14中设计的商品表sh_goods共有21个字段,具体说明如下商品id:主键,使用无符号整型存储,自动增长。。·分类id:商品所属分类,使用无符号整型存储,自动增长。S......
  • 编写函数:递归求逆序 (Append Code) ★
    Description将输入的一个字符串s逆序输出。编写函数recursive()完成程序:原型:intrecursive();功能:用递归的方法读取输入,并且逆序输出。函数的调用格式见“AppendCode”。InvalidWord(禁用单词)错误:在解决这个题目时,某些关键词是不允许被使用的。如果提交的程序中包含了下......
  • Java Lambda表达式与函数式接口和Stream API的常用方法
    JavaLambda表达式常与函数式接口和流(StreamAPI)一起使用,提供了非常强大的方式来处理集合和其他数据结构。以下是一些常用的Lambda表达式方法和它们的用途,特别是在结合java.util.stream.Stream时:1.map()用途:用于将流中的每个元素转换成另一种形式。示例:List<String>name......
  • C++中需要资源释放的变量
    资源或变量需要释放的情况通常是在其内存或其他系统资源是动态分配的或非自动管理的,尤其是在手动分配资源时(如new、malloc、文件句柄、网络连接等)。未释放这些资源会导致内存泄漏或资源泄漏。以下是一些典型需要释放资源的场景:1.动态内存分配通过new、new[]、malloc、calloc......
  • c语言入门第六天输入函数
    一:字符输入函数a:字符输入函数格式为getchar();b:功能:从键盘输入一字符c:返回值:正常,返回从键盘输入的代码值,出错或结束返回-1d:代码展示输出单一字符2:格式输入函数a:格式:scanf("格式控制符",地址表)b:功能:按指定格式从键盘读入数据,存入地址表指定存储单元中,并按回......
  • C++ lower_bound 函数用法
    C++lower_bound函数用法因为文本块不支持下划线,所以以下均打成\(\text{lower-bound}\)。虽然只是简单语法,但是我确实不太能记住。比如很多分块题要求在整块二分,此时如果能善用\(\text{lower-bound}\)函数就能少写一个二分。然后本文只是作者自己看源代码理解的,当然是有不......
  • 第五节---查询---函数
    查询---语法一.显示(limit)limit语句---limit显示语句条数;limit1;---只显示一条语句limit2;---显示三条语句limit语句---limit从第几项开始,获取后面几项;limit1,3;---显示第1条语句后的3条语句先排序后查询orderby列段名desclimit2;limit语句......
  • 在C语言中用函数求fibonacci(斐波那契)数列前n项的和
    1.功能用函数求fibonacci数列前n项的和。2.说明fibonacci数列为数列的第一项值为1,第二项值也为1,从第三项开始,每一项均为其前面相邻两项的和。3.题目例如:当n=28时,运行结果:832039。请编写sum函数。#include<stdio.h>//函数sum用于计算斐波那契数列前n项的和longsum......