精华内容
下载资源
问答
  • 变量提升和函数提升
    千次阅读 多人点赞
    2018-11-23 15:59:50

    一、变量提升

    ES6之前,函数没有块级作用域(一对{}即一个块级作用域),只有全局作用域和函数作用域。变量提升是指将变量申明提升到它所在的作用域的最开始部分。

    例子:

    console.log(foo); // undefined
    var foo = '小花猫';
    console.log(foo)  // 小花猫

    相当于:

    var foo;
    console.log(foo);
    foo = '小花猫';
    console.log(foo);

    二、函数提升

    函数创建有两种方式:1、函数申明形式;2、函数字面量形式(即函数表达式)。【而只有函数声明形式才有函数提升】,还有一种是方式:函数构造法:var a = new Fun(),技术角度来讲也是一个字面量形式。

    // 声明式
    function foo () {
        // to do...
    }

    函数提升,相当于:

    // 函数字面量
    var foo = function () {
        // to do...
    }

    例子:

    console.log(bar);  // f bar() { console.log(123) }
    console.log(bar()); // undefined
    var bar = 456;
    function bar() {
        console.log(123); // 123
    }
    console.log(bar); // 456
    bar = 789;
    console.log(bar); // 789
    console.log(bar()) // bar is not a function

    相当于:

    // js执行步骤
    
    // 函数提升,函数提升优先级高于变量提升
    var bar = function() {
        console.log(123)
    };
    // 变量提升,变量提升不会覆盖(同名)函数提升,只有变量再次赋值时,才会被覆盖
    var bar;
    console.log(bar);
    console.log(bar());
    // 变量赋值,覆盖同名函数字面量
    bar = 456;
    console.log(bar);
    // 再次赋值
    bar = 789
    console.log(bar);
    console.log(bar());

    结果:

    // js执行结果
    
    f bar() { console.log(123) }
    123  // 执行bar()里的console.log
    undefined // bar()的返回值,如果函数没有返回值,默认为:undefined
    456
    789
    [typeError]:bar is not a function

    三、优先级

    函数提升优先级高于变量提升,且不会被同名变量声明时覆盖,但是会被变量赋值后覆盖

     

    最后留个练习题,大家思考一下。

    console.log(person)
    console.log(fun)
    var person = 'jack'
    console.log(person)
    
    function fun () {
        console.log(person)
        var person = 'tom'
        console.log(person)
    }
    fun()
    console.log(person)

     

    更多相关内容
  • 第一篇文章中提到了变量的提升,所以今天就来介绍一下变量提升和函数提升。这个知识点可谓是老生常谈了,不过其中有些细节方面博主很想借此机会,好好总结一下。 今天主要介绍以下几点: 1. 变量提升 2. 函数提升 3....
  • 在ES6之前,JavaScript没有块级作用域(一对花括号{}即为一个块级作用域),只有全局作用域和函数作用域。变量提升即将变量声明提升到它所在作用域的最开始的部分。 上个简历的例子如: console.log(global); // ...
  • 主要介绍了详解javascript中的变量提升和函数提升的相关资料,需要的朋友可以参考下
  • 首先:普遍认为函数声明提升优于变量提升 但为什么下面的结果是这样的呢(第一个输出我们好理解,因为是先编译后赋值,编译的时候先声明了var function,之后再进行赋值)预编译看这篇 console.log(typeof a); //...

    问题

    首先:普遍认为函数声明提升优于变量提升
    但为什么下面的结果是这样的呢(第一个输出我们好理解,因为是先编译后赋值,编译的时候先声明了var 和 function,之后再进行赋值)预编译看这篇

    它们都会进行预解析,函数声明提前于变量声明,但是最终会被变量覆盖!

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

    解释:肯定是函数声明优先,但最后的结果要看谁最后赋值

    函数声明先赋值,变量声明执行到赋值语句才赋值

    因为两种声明方式共同操作一块栈空间,所以,主要看是谁最后赋值的,我们再看一个例子:

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

    这就看的出来了,通过上边的这个demo, 明显可以看出来,应该 函数声明先赋值的,它是在执行上下文的执行阶段一开始的时候就已经进行了赋值操作,所以 最开始 typeof a 可以得到 function;而,变量声明 是要执行到赋值语句的时候才进行的赋值,所以 最后 typeof a 得到是 number;

    参考文章:函数声明 和 var声明的优先级

    展开全文
  • 主要介绍了JS变量提升函数提升实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 变量提升和函数提升

    变量提升

    在js中,使用变量前需要先对其进行声明,所有的js声明变量都由关键字var声明(还有let...)。如果只是声明了变量,并未对其赋值,那么该变量默认值为undefined

    变量提升也就是把变量提升到当前作用域(或者函数)的顶部位置,注意的时,提升的只是变量的声明,并不会将变量的值一同提升上来。列如:

    函数提升

    函数声明:以关键字function开头的函数为函数声明。

    函数表达式(函数字面量):不是以function开头的均可被称为函数表达式

    如图所示:

                       

     在js代码执行之前引擎会先进行预编译,预编译期间会将函数声明提升到当前作用域的最顶端。函数提升只会提升函数声明,函数提升是可以直接在函数声明之前调用函数的,且成功执行它。但是不会提升函数表达式。 如果是两个函数声明,出现在后面的函数声明可以覆盖前面的。

    列如:

    函数提升比变量提升的优先级要高;

    列如,当函数名和变量名同名的情况下,看看他们的结果:

     按照上面变量提升的例子,第一个打印的结果应该为undefined,但是他两个打印值为函数test()函数体,由此可见函数提升比变量提升的优先级要高一些,但是函数不会被变量的声明覆盖,会被变量赋值之后覆盖,如图所示,函数的值被覆盖了:

     

     

     

    展开全文
  • 什么是提升(Hosting)? 引擎会在解释JavaScript代码之前首先...var变量提升 console.log(a); var a = 3; 预编译后的代码结构可以看做如下: var a; // 将变量a的声明提升至最顶端,赋值逻辑不提升。 console.log(a

    什么是提升(Hosting)?
    引擎会在解释JavaScript代码之前首先对齐进行编译,编译过程中的一部分工作就是找到所有的声明,并用合适的作用域将他们关联起来,这也正是词法作用域的核心内容。
    简单说就是在js代码执行前引擎会先进行预编译,预编译期间会将变量声明与函数声明提升至其对应作用域的最顶端。举例来说:
    var变量提升

    console.log(a);
    var a = 3;
    

    预编译后的代码结构可以看做如下:

    var a; // 将变量a的声明提升至最顶端,赋值逻辑不提升。
    console.log(a); // undefined
    a = 3; // 代码执行到原位置即执行原赋值逻辑
    

    函数提升

    console.log(foo1); // [Function: foo1]
    foo1(); // foo1
    console.log(foo2); // undefined
    foo2(); // TypeError: foo2 is not a function
    function foo1 () {
        console.log("foo1");
    };
    var foo2 = function () {
        console.log("foo2");
    };
    

    即函数提升只会提升函数声明,而不会提升函数表达式。
    再举一个小例子:

    var a = 1;
    function foo() {
        a = 10;
        console.log(a);//10
        return;
        function a() {};
    }
    foo();
    console.log(a);//1
    

    上面的代码块经过预编译后可以看做如下形式(只分析foo方法内部情况):

    var a = 1; // 定义一个全局变量 a
    function foo() { // 首先提升函数声明function a () {}到函数作用域顶端, 然后function a () {}等同于 var a =  function() {};最终形式如下
        var a = function () {}; // 定义局部变量 a 并赋值。
        a = 10; // 修改局部变量 a 的值,并不会影响全局变量 a
        console.log(a); // 打印局部变量 a 的值:10
        return;
    }
    foo();
    console.log(a); // 打印全局变量 a 的值:1
    

    函数提升与变量提升的优先级

    console.log(a);    // f a() {console.log(10)}
    console.log(a());    //  undefined
    var a = 3;
    function a() {
      console.log(10) //10
    }
    console.log(a)   //3
    a = 6;
    console.log(a());  //a is not a function;
    

    上面的代码块经过预编译后可以看做如下形式:

    var a = funtion () {
      console.log(10)
    }
    var a;
    console.log(a);    // f a() {console.log(10)}
    console.log(a());  //  undefined
    a = 3;
    console.log(a)   //3
    a = 6;
    console.log(a());   //a() is not a function;
    

    由此可见函数提升要比变量提升的优先级要高一些,且不会被变量声明覆盖,但是会被变量赋值之后覆盖。

    展开全文
  • JS变量提升和函数提升的顺序

    千次阅读 多人点赞 2020-10-19 23:25:36
    今天笔试时碰到考察变量提升函数提升顺序的一道题目,之前只知道var定义的变量会有变量提升以及函数声明也会提升,但没有深入研究他们的顺序以及详细过程。事后查阅资料加上自己的验证,得出了自己对于它们顺序的...
  • js中的变量提升和函数提升

    万次阅读 多人点赞 2018-10-30 13:30:09
    console.log(a);...由于js自上而下逐行解释执行的,有人可能会认为第一行代码引用了一个没有声明的变量a,会抛出 ReferenceError 异常,而注掉第一行后,由于变量 a 在第二行log之前已经声明并赋值,打印结果...
  • 什么是变量提升和函数提升

    千次阅读 2020-03-28 17:30:10
    为什么会输出这样的结果呢,其中牵扯到函数提升和变量提升,且听我慢慢道来 首页明确一点,在es6之前还没有块级作用域,只有全局作用域和函数作用域。 引擎在加载一个js文件时,分为两个步骤: 第一步骤是读取js...
  • 变量提升 在es6之前,js作用域分:全局作用域和函数作用域 在javascript中,定义的变量,变量名会提升到 ‘当前作用域’ 顶部,此时该变量为undefined,未赋值,赋值是在js原位置。 console.log(a); // undefined ...
  • 【JavaScript源代码】JavaScript中变量提升和函数提升实例详解.docx
  • js的变量提升和函数提升 一、变量提升  在ES6之前,JavaScript没有块级作用域(一对花括号{}即为一个块级作用域),只有全局作用域和函数作用域。变量提升即将变量声明提升到它所在作用域的最开始的...
  • 变量提升函数提升

    千次阅读 2021-06-02 08:16:29
    一、变量提升   变量提升即将变量声明提升到它所在作用域的最开始的部分。 ...二、函数提升   js中创建函数有两种方式:函数声明式函数表达式   1、函数声明提升 function fun() { con
  • 我们用循序渐进的例子来看JavaScript中的变量提升和函数提升。 实践一:变量声明提升的优先级高于函数声明提升 比较下面两个例子,将会输出同样的结果: !function(){ console.log(haha); // 输出haha函数 ...
  • 以下两道题目一样,实际上只是一道题目只是打印输出的位置不同:需要了解的内容:① 在浏览器进行编译的时候,变量声明和函数声明都会提升,并且函数声明的提升优先级大于变量声明的提升② 函数表达式不可提升题目...
  • 由此产生了变量提升和函数提升。 1.变量提升只会提升变量名的声明,而不会提升变量的赋值初始化,同理,函数声明也是如此。 2.函数提升的优先级大于变量提升的优先级,即函数提升变量提升之上。 记住这两句话,...
  • 相信大家在学习JS的过程中,会遇到一个词,叫做“预解析”,什么是预解析呢,预解析就是说我程序在执行前,会先检查代码有没有语法错误,就是...声明提升包括两个部分,就是变量提升函数提升。 首先我们先来看变量提
  • 变量提升2. 函数提升3. 函数优先二、暂时性死区三、总结 通常在直觉上我们会认为代码执行时是从上到下按顺序执行的,但在 JavaScript 中(就同步代码而言),这并不完全正确。 小二,上栗子! 实例 1: a = 2; var ...
  • 变量提升和函数提升的优先级 小结: 一、概念理解 变量提升:在当前作用于中,js代码自上而下执行之前,浏览器会把所有带var/function关键字进行提前声明或定义。带var的关键字只是提前声明一下,带function的...
  • 相信大家学习JS时,对于变量提升和函数提升这个会有很多疑惑,为什么设计这个,不像其他动态语言一样,是从上到下逐句依次执行,有人说这个的设计其实是低劣的,或者是语言实现时的一个副作用。它允许变量不声明就...
  • JavaScript中的变量提升和函数提升

    千次阅读 多人点赞 2018-03-29 14:31:26
      在理解变量提升和函数提升之前,我们需要先理解好JavaScript的作用域的奇特之处。 没有块级作用域   和C、C++、以及Java不同,在ES6之前,JavaScript没有块级作用域,只有全局作用域和函数作用域。 注...
  • 概念一:变量提升函数提升 变量提升 console.log(a) var a = 1 该示例将会输出undefined 以上代码相当于: var a console.log(a) a = 1 可以看到,我们进行变量声明的语句 var a 被提前执行了,但该变量并没有...
  • 首先变量和函数声明都提升,但函数提升优先级高于变量,都提升后变量只是定义没有赋值,所以输出的是函数a。,我以前根本就没有听说过,但是我我做题也没有错过,这就有点奇怪,后来发现只是解题思路不一样,但是...
  • 什么是变量提升?什么是函数提升? 在js中只有两种作用域,全局作用域函数作用域,在ES6之前,js是没有块级作用域。 JavaScript 代码的执行分为两个阶段。第一个阶段在当前词法环境中注册所有的变量函数声明,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 277,971
精华内容 111,188
关键字:

变量提升和函数提升

友情链接: MDK_training_beable.rar