首页 > 编程语言 >5 JavaScript变量提升

5 JavaScript变量提升

时间:2023-08-21 16:33:26浏览次数:53  
标签:log console 变量 JavaScript let 提升 fn name

5 变量提升

看以下代码, 或多或少会有些问题的.

function fn(){
    console.log(name);
    var name = '大马猴';
}
fn()

发现问题了么. 这么写代码, 在其他语言里. 绝对是不允许的. 但是在js里. 不但允许, 还能执行. 为什么呢? 因为在js执行的时候. 它会首先检测你的代码. 发现在代码中会有name使用. OK. 运行时就会变成这样的逻辑:

function fn(){
    var name;
    console.log(name);
    name = '大马猴';
}
fn()

看到了么. 实际运行的时候和我们写代码的顺序可能会不一样....这种把变量提前到代码块第一部分运行的逻辑被称为变量提升. 这在其他语言里是绝对没有的. 并且也不是什么好事情. 正常的逻辑不应该是这样的. 那么怎么办? 在新的ES6中. 就明确了, 这样使用变量是不完善的. es6提出. 用let来声明变量. 就不会出现该问题了.

function fn(){
    console.log(name);  // 直接报错, let变量不可以变量提升.
    let name = '大马猴'; 
}
fn()

结论一, 用let声明变量是新版本javascript提倡的一种声明变量的方案.
let还有哪些作用呢?

function fn(){
    // console.log(name);  // 直接报错, let变量不可以变量提升.
    // let name = '大马猴';
    var name = "JAY";
    var name = "WLH注意, 报错是发生在代码检查阶段. 所以. 上述代码根本就执行不了. 

==结论二, 在同一个作用域内. let声明的变量只能声明一次. 其他使用上和var没有差别==";
    console.log(name);
}
fn()

显然一个变量被声明了两次. 这样也是不合理的. var本意是声明变量. 同一个东西. 被声明两次. 所以ES6规定. let声明的变量. 在同一个作用域内. 只能声明一次.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>变量提升</title>
</head>
<body>

    <script src = "变量提升.js"></script>

</body>
</html>
代码效果图如下:
// // 变量提升
// function fn() {
//     console.log(name);
//     var name = '大马猴';
// }
// fn();
//
// function fn() {
//     var name;
//     console.log(name);
//     name = '大马猴';
// }
// fn();

// // let 声明变量可以避免变量提升问题
// function gn() {
//     console.log(name);  // 直接报错, let变量不可以变量提升.
//     let name = '大马猴';
// }
// gn();


// function sn() {
//     var name = 'jay';
//     var name = 'wlh';
//     console.log(name);
// }   // 一个变量被声明了两次. 这样也是不合理的
// sn();   // wlh

// // 在同一个作用域内. let声明的变量只能声明一次. 其他使用上和var没有差别
// function xn() {
//     let name = 'jay';
//     console.log(name);
//     let name = 'wlh';
//     console.log(name);
// }
// xn();   // 报错是发生在代码检查阶段. 所以. 上述代码根本就执行不了

标签:log,console,变量,JavaScript,let,提升,fn,name
From: https://www.cnblogs.com/zczhaod/p/17639686.html

相关文章

  • 狗狗求职记:AI 面试、人类辅助,美研究所利用 628 只拉布拉多数据,提升嗅觉检测犬选拔效率
    内容一览:犬类嗅觉灵敏,是执行困难任务的得力助手。然而,工作犬选拔需要经过严格的筛选和训练,淘汰率极高。利用监督式机器学习和任务数据,可以用来预测人类工作表现,然而,目前尚未发现类似的犬类研究。关键词:工作犬  监督式机器学习  随机森林本文首发于HyperAI超神经微信公众平......
  • 9 JavaScript闭包
    9闭包我们都知道,函数里是可以访问函数外的全局变量,而函数外不能访问函数内的局部变量,如下://函数外定义a,在函数内可以访问vara="测试";functionfn(){console.log(a);}fn();执行结果://函数内定义a,在函数外访问不到functionfn(){vara="测试";}co......
  • javascript学习笔记day4
    今天重点学习了数组,老实说学过了c#和python的数组,但是今天重新接触js的数字还是有很多要重新学习的,下面是今天的笔记查询条件五个以上时,switch的效果比iflese高两倍以上.letarr=[]声明数组letarr=newArray(1,2,3,4)声明数组修改数组letarr=['a','b','c']for(letinde......
  • JavaScript中的“函数式编程”
    前言我们虽然之前老是听说过“函数式编程”,但一直不能理解,我们静下心来研究了一下,才发现这些东西真的很巧妙。在React这些框架中,对象,函数为王,因为框架已经帮你打建好了在框架中,数据为王,那些函数本身就是用来处理数据这里我们要用更高层的思维,而放弃底层思维,这些本身都是用户数......
  • JavaScript中的数值
    JavaScript中的主要数值类型是Number类型,用于表示整数和近似的实数。JavaScript采用了由IEEE754标准定义的64位浮点格式来表示数值。这意味着JavaScript可以表示最大整数±1.7976931348623157×10^308和最小整数±5×10^-324。JavaScript中的这种数值格式允许我们准确......
  • docker 设置环境变量
    dockerrun-itd--namejf--restart=always--privileged=true-p8080:8080-v/home/yida/apps/jf/logs-8076:/usr/local/tomcat/logs-eMYSQL_SERVICE_HOST=10.143.133.118-eMYSQL_SERVICE_PORT=3306-eMYSQL_SERVICE_USER=root-eMYSQL_SERVICE_PASSWORD=5mLzHsy......
  • 使用redis pipeline提升性能
    前言本篇来介绍一下redispipeline,主要是由于最近一次在帮开发同学review代码的时候,发现对redis有个循环操作可以优化。场景大概是这样的,根据某个uid要从redis查询一批数据,每次大概1000个key左右,如果查得到就返回,否则查db,然后写回缓存。由于每次要查的key比较多,虽然redis单次查询......
  • 变量
    变量1.类变量,实例变量,局部变量publicclassDemo04{​  //属性​  //布尔值:默认false​  //类变量static  static doublesalar=2500;   //实例变量:如果不初始化,这个类型默认值0,00  Stringname;  intage;​  //main方法 ......
  • 《深入浅出Java虚拟机 — JVM原理与实战》带你攻克技术盲区,夯实底层基础 —— 吃透cla
    前言介绍了解Java代码如何编译成字节码并在JVM上执行是非常重要的。这种理解可以帮助我们理解程序执行时发生的情况,确保语言特性符合逻辑,并在进行讨论时能够全面考虑各种因素和副作用。本文将深入探讨Java代码编译成字节码并在JVM上执行的过程。如果您对JVM的内部结构和字节码执行......
  • 8 JavaScript函数
    8JavaScript函数在JS中声明函数和python差不多.也要有一个关键字顶在前面.python是def,到了JS里换成了function,只不过在JS中没有像python那么死板,必须def后面必须跟上函数名.这也为我们未来做逆向提供了第一个超大的伏笔.//语法//声明函数function函数名(形参1,......