js关于变量提升

4 篇文章 0 订阅
3 篇文章 0 订阅
js 中,传统声明变量是var、function;es6中是let、const、import。

变量提升(var、function)

  1. var function 声明的变量都存在变量提升机制,而且function 声明的变量会提前声明+定义。
  2. 基于 var function 声明的全局变量会给全局对象GO(window)增加一个对应的私有属性,它们之间有一个映射机制(一个修改,另一个也会跟着修改)
  3. 使用var 声明变量,使用var声明的变量会发生提升,变量提升就是把我们所写的变量声明代码提升到它所在作用域的顶端去执行,在代码所在的位置来赋值

运行代码:

<script>
    function test() {
        if (false) {
            var web=123;
        }
        console.log(web);
    }
    test(); 
    //输出undefined
</script>

提升后实际运行:

<script>
    function test() {
        var web;
        if (false) {
             web=123;
        }
        console.log(web);
    }
    test(); 
    //输出undefined
</script>
//声明式
function test() {}
//字面量式 
var test1 = function () {}

字面量式的函数提升效果跟变量提升的效果是一样的,因为字面量式的函数只是一个具体的值。

声明式的函数提升是整个代码块提升到它所在的作用域的最开始执行的地方,拥有最高的优先级。

let 、const

let 的检测是否重复声明发生在词法解析阶段(js代码自上而下执行,浏览器会提前处理很多事情,例如词法解析—>变量提升—>代码执行 等)。一旦在词法解析这一阶段报错,js代码一行都不会执行的。

  1. let const 都是声明一个变量,但是const声明的变量不允许指针重新指向,且const声明的时候必须赋值,否则会报错。

变量赋值本质上就是一个指针指向的过程。const变量的值如果是引用数据类型的话,那么是可以改变里面的值的(这并不会改变指针的指向)。

  1. let const 不存在变量提升,所以必须先声明后使用
  2. let const 声明的变量并不会给全局对象GO(window)增加属性。所以带声明的变量和不带声明的变量是不一样的机制,平时写的时候不要省略。

如果变量不带任何声明,则默认是给全局对象GO(window)增加属性,该变量就不会提前声明。

  1. 同一上下文中,let不允许重复声明
  2. 在ES6中基于let/const等方式创建的变量或者函数都不存在变量提升机制

旧版本变量提升

旧版本浏览器没有块级作用域这种说法,只有全局作用域与函数作用域
变量提升定义:js在代码执行之前,会将变量声明提升到所属作用域的最顶端

当变量同名时函数提升的优先级高于变量提升
提升变量时,提升的是变量的声明,而提升函数时,会将函数的声明和定义一起提升

新版本变量提升

新版本中函数变量提升更改为了只提升函数的声明,而不提升函数的定义

暂时性死区

如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。在代码块内使用let命令声明变量之前,该变量都是不可用的,称为“暂时性死区”(temporal dead zone,简称TDZ)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 JavaScript 中,变量提升指的是在代码执行前,变量声明就已经被提升(即复制)到了当前作用域的最顶端。这意味着,无论变量在代码中定义在哪里,它都会在代码执行前被提升到所在作用域的最顶端。 例如: ``` console.log(a); // undefined var a = 1; ``` 在这个例子中,虽然变量 `a` 实际上定义在了第二行,但是在代码执行前,它已经被提升到了最顶端。所以在第一行中,当我们尝试访问 `a` 时,它已经被声明过了,所以输出 `undefined`。 注意,变量提升仅仅是声明(复制)被提升,而不是赋值。所以在上面的例子中,变量 `a` 的值在第二行被赋值为 1,而不是在第一行被赋值为 `undefined`。 ### 回答2: JavaScript变量提升JavaScript中的一种特性。在JavaScript中,变量的声明会在代码执行之前进行处理,也就是说它们会被“提升”到其作用域的顶部。这意味着你可以在声明之前使用变量,而不会引发错误。 例如,假设我们有以下的JavaScript代码: ``` console.log(x); // undefined var x = 5; console.log(x); // 5 ``` 在这个例子中,变量x被提升到了代码的顶部,所以在第一个console.log语句中,x被声明了但尚未被赋值,所以它的值是undefined。然后,变量x被赋值为5,并在第二个console.log语句中打印出来。 需要注意的是,只有变量的声明会被提升,而不是它们的赋值。例如: ``` console.log(y); // ReferenceError: y is not defined y = 10; console.log(y); // 10 var y; ``` 在这个例子中,变量y在它的声明之前被使用会引发错误。只有在变量y的声明后,它的赋值才会生效。 变量提升在理解JavaScript的作用域和执行顺序时非常重要。它使得我们可以在变量声明之前使用变量,但也可能导致一些意外的结果,所以在编写代码时要小心使用。 ### 回答3: JavaScript变量提升是指在代码执行之前,所有变量的声明都会被提升到代码的顶部。这意味着我们可以在变量声明之前使用这些变量。但是要记住的是,只有变量的声明会被提升,而不是初始化。 例如,我们可以在变量声明之前输出变量的值: console.log(x); // undefined var x = 5; 这段代码中,变量x在声明之前被赋值为undefined,因此在打印x时,它的值是undefined。 变量提升还可以应用于函数声明。我们可以在函数声明之前调用函数: myFunction(); // "Hello, World!" function myFunction() { console.log("Hello, World!"); } 在这个例子中,函数myFunction在声明之前被调用,所以我们可以在调用函数之前定义它。 需要注意的是,变量提升仅适用于使用var关键字声明的变量,而不适用于使用let和const关键字声明的变量使用let和const声明的变量是块级作用域的,不会被提升。 综上所述,JavaScript变量提升是一种将变量的声明提升到代码顶部的机制,使我们可以在变量声明之前使用这些变量。这在代码书写和阅读上提供了一定的便利,但也需要注意一些细节,以避免出现意料之外的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值