5 JavaScript的变量提升

5 JavaScript的变量提升

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

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();   // 报错是发生在代码检查阶段. 所以. 上述代码根本就执行不了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

生而自由爱而无畏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值