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

函数提升和变量提升

时间:2024-03-05 10:45:06浏览次数:20  
标签:function console log 提升 赋值 变量 函数

1:函数提升优先级高于变量提升,且不会被同名变量声明时覆盖,但是会被同名变量赋值后覆盖,注意看 赋值和打印的位置

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

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

 

a(); // 2
var a = function(){ // 看成是一个函数赋值给变量a(函数表达式不会被函数提升)
console.log(1)
}
a(); // 1
function a(){
console.log(2)
}
a(); // 1
只有函数声明才会提升函数表达式不会提升,所以在函数表达式后面的代码会输出1,因为变量a赋值后把提升的函数a覆盖了。详细过程如下:

function a(){ // 函数提升
console.log(2)
}
var a; // 变量提升
a(); // 2
a = function(){ // 变量a赋值后覆盖上面的函数a
console.log(1)
}
a(); // 1
a(); // 1

 

代码4

a();
function a(){
console.log(1)
}
function a(){
console.log(2)
}
打印的是2,先声明的会被后声明的覆盖。

 

代码5

var a = 0;
console.log(a)//0
if (true) {
a = 1;
console.log(a)//1
function a() {console.log('a 函数')};
a = 21;
console.log(a);//21
console.log(window.a)//1
}
console.log(window.a)//1
console.log(a);//1

解析后

var a = 0;
console.log(a)
if (true) {
a = 1;//此时的赋值将a=0覆盖 a 是全局变量
console.log(a)//输出1
function a() {console.log('a 函数')};  //声明一个函数时 相当于在判断语句里面 var a;
a = 21;//将a赋值为21 但未改变全局变量
console.log(a);//输出为21
console.log(window.a)//全局a是1
}
console.log(window.a)//全局a是1
console.log(a);//输出1

 

标签:function,console,log,提升,赋值,变量,函数
From: https://www.cnblogs.com/fanjiawen/p/18053479

相关文章

  • 2024年,提升Windows开发和使用体验实践 - 终端&命令行篇
    前言经过前面的铺垫,终于继续更新了,这个大概率是本系列近期的最后一篇了。同时之前有些内容更新,我也补充到这一篇里面。关于scoop管理器的补充scoop常用命令scoophelp#查看帮助scoophelp<某个命令>#具体查看某个命令的帮助scoopinfo<app>#查看APP信......
  • 基本操作之——正弦函数绘制
    1.周期为2pi正弦函数绘制dev_close_window()dev_open_window(0,0,512,512,'black',WindowID)dev_set_part(0,0,511,511)old_x:=0old_y:=0Rate:=1dev_set_color('red')forx:=1to511by4y:=-sin(x/511.0*2*3.1416*Rate......
  • 学java10变量
    1.变量:可以变化的量Java是一种强类型语言,每个变量都必须声明其类型。Java变量是程序中最基本的存储单元,其要素包括变量名,变量类型和作用域。//数据类型变量名=值;可以使用逗号隔开来声明多个同类型变量(但不建意)inta=1,b=2,c=3;Stringname="lml";charx="X";doubl......
  • C++面试,实现memcpy,strcpy这2个函数的功能
    `strcpy`和`memcpy`都是用于内存复制的函数,但它们之间有几个关键的区别:1.**复制的对象**:-`strcpy`主要用于复制字符串,它将从源字符串的起始位置开始复制字符,直到遇到源字符串的空字符('\0'),然后将空字符也复制到目标字符串中,表示字符串的结束。-`memcpy`则是通用的内存复......
  • python 语法之 print 函数和 input 函数
    print函数input函数案例一:圆的周长importmaths=input("圆的半径:\n")s=float(s)c=2*math.pi*sprint(f"圆的周长,{c:.2f}")w=input("请输入天气情况(可选项:晴、阴):")ifw=="晴天":print("play")else:print(f"天气{w}不玩")......
  • 42函数对象
    函数对象#include<iostream>usingnamespacestd;/*template<typenameT>boolmygreater(Ta,Tb){  returna>b;}template<typenameT>boolmyless(Ta,Tb){  returna<b;}*//*1.通过函数对象调用operator(),可以省略函数的调用开销,比通过函数......
  • 编码绕过xss说明和htmlspecialchars函数
    html实体编码JS编码1.htmlspecialchars函数把一些预定义的字符转换为html实体预定义的字符&->&amp;"->"'->'<-><>->gt;<script>--><&ltscript&gt默认绕过绕过方式:payload:'onclick='alert(123)'或者&#......
  • python变量命名规范
    简单地理解,标识符就是一个名字,就好像我们每个人都有属于自己的名字,它的主要作用就是作为变量、函数、类、模块以及其他对象的名称。Python中标识符的命名不是随意的,而是要遵守一定的命令规则标识符是由字符(A~Z和a~z)、下划线和数字组成,但第一个字符不能是数字。标识符不能和......
  • c++在类外是不能直接调用私有成员函数的
    c++在类外是不能直接调用私有成员函数的,比如#include<iostream>usingnamespacestd;classA3{voidshow3(){cout<<"classA3"<<endl;//注意,类内部默认是私有}};intmain(){A3obj3;obj3.show3();//这里出错return0;}......
  • 别再低效筛选数据了!试试pandas query函数
    数据过滤在数据分析过程中具有极其重要的地位,因为在真实世界的数据集中,往往存在重复、缺失或异常的数据。pandas提供的数据过滤功能可以帮助我们轻松地识别和处理这些问题数据,从而确保数据的质量和准确性。今天介绍的query函数,为我们提供了强大灵活的数据过滤方式,有助于从复杂的......