第4章变量提升和函数的提升

简介: 第4章变量提升和函数的提升
a = 2;
var a;
console.log(a);//输出的是2
// 它等价于
var a;
a=2;
console.log(a);//2
================
console.log(a)
var a=2;//输出undefined
等价于
var a;
console.log(a)
a=2;


因为var具有提升;


提升:在预编译阶段,编译器会把所有定义的变量提升到最顶部,但是值还是保留在原来的位置上;


foo();
function foo(){
    console.log(a);//输出undefined
    var a=2;
}
等价于
function foo(){
    var a;
    console.log(a);//输出undefined
    a=2;
}
foo();


说明了函数声明,和var 声明的变量都有提升;


foo();
var foo=function bar(){
    //do something()
}


因为这是一个函数表达式;函数表达式不会被提升,所以会报错;


函数声明和变量声明都会被提升,但是函数会首先被提升,然后才是变量


foo();
var foo;
function foo(){
    console.log(1);
}
foo=function(){
    console.log(2);
}

等价于


function foo(){
    console.log(1);   
}
foo(); //输出1
var foo;
foo=function(){
    console.log(2);
}


var a = 10;
function a() {};
console.log(typeof a);//number


它等价于

function a() {};
var a = 10;
console.log(typeof a);//number


因为:函数声明和变量声明都会被提升,但是函数会首先被提升,然后才是变量


console.log(a);    //f a(){console.log('hi');}
console.log(b);    //undefined
function a() {
  console.log('hi');  
}
var b = function() {
  console.log('ok');  
}


它等价于


function a() {
  console.log('hi');  
}
var b;//undefined;
console.log(a);    //f a(){console.log('hi');}
console.log(b);    //undefined
b = function() {
  console.log('ok');  
}


记住预编译


二者优先级:函数提升会优先于变量提升,而且不会被同名的变量覆盖.


但是,如果这个同名变量已经赋值了,那函数变量就会被覆盖。


当二者同时存在时,会先指向函数声明。


console.log(a);    //f a() {...}
console.log(a());    //2
var a = 1;
function a() {
  console.log(2);  
}
console.log(a);    //1
a = 3;
console.log(a());    //报错,现在的函数a已经被赋值过后的变量a给覆盖了,无法再调用a()


等价于


function a() {
  console.log(2);  
}
var a;
console.log(a);    //f a() {...}
console.log(a());    //2
a = 1; //同名变量已经赋值了,那函数变量就会被覆盖。
console.log(a);    //1
a = 3;
console.log(a());    //报错,现在的函数a已经被赋值过后的变量a给覆盖了,无法再调用a()


在读第4章的时候,提升这一章的时候,我就比上一章好些,很多地方都懂,


淡然这一章节一点都不难,我之前也很清楚这一章。


但是还有一个地方不是特别的懂!


参考的地址


https://blog.csdn.net/sunlizhen/article/details/99844964


https://www.cnblogs.com/hey-Sarah/p/13449699.html

相关文章
|
11月前
|
存储 人工智能
AscendC编程中的double buffer是什么?
在AI Core上,指令队列分为Vector(V)、Matrix(M)和存储移动指令队列(MTE2、MTE3)。这些队列的独立性和可并行性是double buffer优化的基础。通过将数据搬运与Vector计算并行执行,double buffer机制有效减少了Vector单元的等待时间,提高了其利用率。例如,Tensor1进行Compute时,Tensor2可同时执行CopyIn;当切换到Tensor2计算时,Tensor1执行CopyOut。此机制适用于大多数场景,但在数据搬运时间短或数据量小的情况下,性能提升可能有限。
|
网络架构
react18【系列实用教程】react-router-dom —— 路由管理 (2024最新版)
react18【系列实用教程】react-router-dom —— 路由管理 (2024最新版)
532 0
|
人工智能 算法 机器人
【目标识别】自适应多机器人编队,可在运动和能见度约束下包围和跟踪目标(Matlab代码实现)
【目标识别】自适应多机器人编队,可在运动和能见度约束下包围和跟踪目标(Matlab代码实现)
252 0
|
Cloud Native Devops 持续交付
构建未来:云原生架构在企业数字化转型中的关键作用
【4月更文挑战第14天】 随着企业加速迈向数字化,云原生架构成为支撑其转型战略的核心技术之一。该文章深入探讨了云原生技术如何通过提供灵活、可扩展的解决方案来满足现代业务需求。分析了容器化、微服务、持续集成和持续部署(CI/CD)以及DevOps文化对于构建和维护高效、可靠的云基础设施的重要性。同时,讨论了企业在采用云原生架构时可能面临的挑战,并提出相应的策略以克服这些障碍。
105 6
|
SQL JavaScript 数据可视化
MyBatis-Plus 可视化代码生成器来啦,让你的开发效率大大提速!!
MyBatis-Plus 可视化代码生成器来啦,让你的开发效率大大提速!!
|
机器学习/深度学习 编解码 算法
Fast R-CNN论文详解
Fast R-CNN论文详解
Fast R-CNN论文详解