美文网首页
函数提升与变量提升

函数提升与变量提升

作者: xiudaozhe | 来源:发表于2020-07-14 14:49 被阅读0次

以下内容不一定对,仅个人理解

众所周知,类似var a = 1;这种可分为两步,第一步编译为var a;提升至自身作用域(非块状作用域)最顶端,第二步执行a = 1;而函数也存在提升,如果函数与变量同时存在且同名时。函数优先提升,变量之后提升,由于变量提升时是重复声明,所以会被忽略掉。

var x = 1
function x(){}
console.log(x)    //1
//以上代码可看成如下
function x(){};  //函数提升,之后var x;变量提升,但属于重复声明,忽略
x = 1;  //执行x = 1

看完上面代码后我觉得我懂了,然鹅面试题跟我说,不,你不会。。。

var a = 0;
if (true) {
    a = 10;
    console.log(a, window.a);    //10 0

    function a() {}
    console.log(a, window.a);    //10 10
    a = 20;
    console.log(a, window.a);    //20 10
}
console.log(a);                    //10

上面的代码多了个块级作用域。情况就复杂了。
如果按照我之前的简单理解,函数提升至顶部。转换后代码如下:

function a(){}
a = 0;
if(true){
  a = 10;
  console.log(a, window.a);    //10 10

  console.log(a, window.a);    //10 10
  a = 20;
  console.log(a, window.a);    //20 20
}
console.log(a);                    //20
//可见以上代码运行结果跟原代码的并不一致

所以函数的提升应该不是简单的提升到顶部。特别是在存在块作用域的情况下
以下就纯属猜想了。
1、函数声明会提升至在其所在函数作用域顶部。但并未把函数体提升过去,仅创建一个函数名的变量标识,内容为undefined
2、函数声明会同时提升至块作用域顶部,创建类似let的块作用域变量(仅块作用域有效)
3、当运行至函数声明位置时,会将1步骤中提升至函数作用域顶部的变量重新赋值为当前值。
如果按以上三条规则,翻译原代码如下

var a; //函数提升至所在非块作用域(当前为全局)顶部
        //忽略第二次var a
a = 0; //第一次赋值(原var a = 0;拆分为var a和a=0)
if (true) {
    let a = function() {}; //函数提升至块作用域顶部(此处a与外部a不是同一个)
    a = 10; //块内赋值
    console.log(a, window.a);

     window.a = a;     //函数所在行执行后会映射至外部(最近的非块作用域)
     console.log(a, window.a);
     a = 20;
     console.log(a, window.a);
}
console.log(a);  

按以上规则顺利解决问题。

相关文章

  • 关于变量提升

    函数提升的优先级要高于变量提升,变量提升到函数声明的后面; 变量提升,但是赋值不提升,函数表达式不提升;

  • JS中的提升

    JS中包含两种提升,变量提升和函数提升。 变量提升 变量提升只能是var或者function声明的变量或者函数,l...

  • let const var

    变量提升 函数会优先于变量提升; 函数提升会把整个函数移到作用域顶部 变量提升智慧把变量的定义移到作用域顶部 wi...

  • 变量提升与函数提升

    注:变量提升,更通俗的说法是将“识别符”提升到它所作用域的最前面。 比如:函数里面申明一个变量,var i=10;...

  • 变量提升与函数提升

    变量声明提升通过var定义(声明)的变量,在定义语句之前就可以访问的值:undefined 函数声明提升通过fun...

  • 变量提升与函数提升

    变量提升与函数提升 我们知道 这个时候运行a() 输出 jirengu ;而 这个时候a()输入结果却为undef...

  • 函数提升与变量提升

    以下内容不一定对,仅个人理解 众所周知,类似var a = 1;这种可分为两步,第一步编译为var a;提升至自身...

  • js3-函数变量提升 顶层函数 数据类型转换 Math对象 js

    函数变量的提升 函数内部变量提升: 函数内部使用变量, 默认情况下, 函数会把下面变量它的声明提升到函数的最上边 ...

  • Javascript 变量执行过程 和 数组 & 对象的区别

    变量提升 JS执行过程1. 先提升(先提升函数,再提升变量,如果名字一样,变量提升会覆盖函数提升)2. 再执行,如...

  • 闭包

    提升 1 变量提升 2 函数表达式 函数表达式的提升 === 变量提升 3 函数声明 demo 执行环境&词法作用...

网友评论

      本文标题:函数提升与变量提升

      本文链接:https://www.haomeiwen.com/subject/amnxhktx.html