精华内容
下载资源
问答
  • 变量声明提升
    2022-03-13 15:10:19

    变量和作用域的关系

    任何声明在某个作用域内的变量,都将附属于这个作用域。

    我们习惯上将 var a=2,看做一个声明,而实际上JavaScript引擎并不这么认为,他将var a,与a=2,当做两个单独的声明,第一个是编译阶段的任务,第二个则是执行阶段的任务,无论声明在何处,都将在代码本身被执行前首先进行处理,可以理解为所有的声明(变量和函数)都会被移动到各自作用域的最顶端,这个过程被称为提升。

    console.log(a); //undefined
    var a=2;
    
    c=2
    console.log(c); //2
    var c;

    函数优先

    函数声明和变量都会被提升,但是首先是函数,然后才是变量。

    fun();
    var foo;
    function(){
      console.log(1);
    }
    fun=function(){
      console.log(2);
    }
    //最后输出为1

    声明本身会被提升,而包含函数表达式在内的赋值操作并不会提升。

    fun();  //TypeError
    var fun=function bar(){
      ...
    }

    这段程序中的变量标识符fun()被提升并分配给所在的作用域,因此foo()不会导致ReferenceError,但是fun此时并没有被赋值(如果他是一个函数声明而不是函数表达式,那么就会赋值),fun()由于对undefined值进行调用而导致非法操作,因此导致TypeError异常。

    更多相关内容
  • 一、变量声明提升  hoisting 英[‘hɔɪstɪŋ] 美[‘hɔɪstɪŋ]  n. 起重,提升  v. 把…吊起,升起( hoist的现在分词 ) 先来看一个栗子 var cc = 'hello'; function foo(){ console.log(cc); var cc = ...
  • 本文实例讲述了JavaScript变量声明提升。分享给大家供大家参考,具体如下: 如下代码输出的结果是? var num = 123; function foo1(){ console.log( num ); //undefined var num = 456; console.log( num ); //...
  • js中的变量声明提升

    2019-06-23 11:31:22
    两个小问题 什么是变量声明提升

    两个小问题

    问题一:输出什么?

    console.log(fun)
    var fun = 2
    function fun (a) {
        return a
    }
    

    问题二:输出什么? 如果把var变更为let呢?

    console.log(foo);
    var foo = { n: 1 };
    
    (function (foo) {
        console.log(foo);
        foo.n = 3;
        var foo = { n: 2 };
        console.log(foo);
    })(foo);
    
    console.log(foo);
    
    if(自信回答){
    	跳过本篇
    }else{
    	继续阅读
    }
    

    以上问题,涉及一个问题:变量 声明提升 (Hosting)


    什么是变量声明提升?

    为避免不必要的误解,本文中对变量的周期描述为:声明初始化赋值
    JS代码的执行过程分为两个阶段:
    1.预解析阶段:进入某作用域时,js解析器会受限找到当前作用域中所有的变量和函数进行声明(提前在内存中为变量开辟好空间)
    2.执行阶段: 执行当前作用域中的代码(遇到变量赋值则赋值)

    变量声明提升是如何进行的?(var关键字声明)

    <script>
    	console.log(a, fun) //undefined undefined
    	var a = 1
    	var fun () {}
    	console.log(a, fun) //1 Function
    </script>
    

    1、js解析器会找到当前作用域中的变量和函数 , a和fun
    2、将其声明过程提升到当前作用域的顶部
    3、初始化变量为undefined

    以上代码段相当于

    <script>
    	var a
    	var fun
    	console.log(a, fun) //undefined undefined
    	a = 1
    	fun () {}
    	console.log(a, fun) //1 Function
    </script>
    

    变量声明提升的一些误区

    1、函数与变量名冲突(同名)

    策略:**函数优先变量进行声明提升

    console.log(fun)	// Function
    var fun = 2
    function fun (a) {
        return a
    }
    
    2、变量与形参冲突(同名)

    规范:对形参和变量均保存在该作用域的变量对象当中。
    10.5 Declaration Binding Instantiation
    Every execution context has an associated VariableEnvironment. Variables and functions declared in ECMAScript code evaluated in an execution context are added as bindings in that VariableEnvironment‘s Environment Record. For function code, parameters are also added as bindings to that Environment Record.

    策略:**声明变量与形参重名,则该变量即形参 **
    可以分为两种情况,变量只声明未赋值,变量声明后赋值。

    console.log(foo);
    var foo = { n: 1 };
    
    (function (foo) {
        console.log(foo);
        foo.n = 3;
        var foo = { n: 2 }; //
        console.log(foo);
    })(foo);
    
    console.log(foo);
    //undefined 
    // { n: 1 }
    // { n: 2 }
    // { n: 3 }
    其中
    var foo = { n: 2 };
    等价于
    var foo
    foo = {n:2}	//此时foo重新指向新的对象
    

    var进行变量声明提升的过程存在与我们认知不符的情况

    console.log(a)	//undefined
    a = 1
    console.log(a)	// 1
    

    1、在声明变量前,就可以使用该变量,不合理吧
    2、赋值前使用该变量竟然输出undefined, 我们并未对此变量进行赋值
    于是就有了ES6的 let、const声明


    ES6 的let const

    let const变量声明提升过程:
    1、预解析阶段:JS解析器找到该作用域中所用变量,进行变量声明(即在内存中开辟存储位置,但并不初始化)
    2、执行阶段:对变量进行赋值等等。。。。
    特点
    1、let、const声明变量同样存在变量声明提升问题,但其有一个特性:暂时性死区,变量声明之前,不可调用该变量,否则会报错
    2、let、const声明变量绑定声明时的作用域,这个特性其实为JS新增了块级作用域
    3、作用域中不能重复声明,否则会报错,解决了变量名称冲突问题
    4、const用以声明一个只读的变量,一旦声明,则该变量在内存(栈)中位置不可变。(不清楚这句话含义可查读JS中变量存储、值传递、深、浅拷贝等知识点)

    展开全文
  • 函数、变量声明提升,类是否存在声明提升?

    你如果已经看过我上次写的变量提升的文档,那么下面我们一起来看以下变量提升相关的面试题。

    题目1:

    var a=2;
    function fn(){
        b();
        return ;
        var a=1;
        function b(){
            console.log(a);
        }
    }
    fn();

     看到内部有函数和var变量,先不要直接就出结果,有可能和实际结果差别很大,要先把变量和函数提升以下,调整一下顺序

    var a=2;
    function fn(){
        var b=function(){
            console.log(a);
        }
        var a;
        b();
        return ;
        a=1;
    }
    fn();

     调整顺序之后是不是觉得,答案很清晰,输出结果为:

    undefined

     执行b() 的时候, 打印a,发现a做了声明但是未赋值,所以打印undefined

    小结:上面是我们经常遇到的,函数声明和变量声明会提到函数的开头,但是函数声明优先级要高于变量声明的优先级,具体可参考Javascipt变量提升、作用域

    既然函数和变量存在声明提升的问题,那类是否存在变量声明提升的问题呢?,下面这一道题,将会解答这个问题

    题目2:

    var a=1;
    function test(){
    console.log(a)
    class a{
    }
    console.log(a)
    }
    test()

    很多人看到这个题,以为执行顺序是

    var a=1;
    function test(){
    class a{
    }
    console.log(a)
    console.log(a)
    }
    test()
    

    这样理解是错的,类是不存在变量提升,变量提升只有变量、函数,没有函数呦!正确的输出结果是:

    第一处报错 ,第二处打印class a{} 

    原因:因为class和let都有暂时性死区,在声明前无法访问,只有在当前作用域中声明之后才能访问,同时es6中class、let 、const一样都不存在变量提升。所以第一处打印的时候,a没有定义会报错,而第二处将会打印定义之后的class a

    展开全文
  • js 函数声明提升和变量声明提升

    千次阅读 2018-08-06 18:16:42
    1. 函数声明提升 func() function func () { } 上例不会报错,正是因为 ‘函数声明提升’,即将函数声明提升(整体)到...2. 变量声明提升(只有var声明的变量才有变量提升,let、const无;变量赋值无提升) ...

    1. 函数声明提升

    func()
    function func () {
    }

    上例不会报错,正是因为 ‘函数声明提升’,即将函数声明提升(整体)到作用域顶部(注意是函数声明,不包括函数表达式),实际提升后结果同下:

    // 函数声明提升
    function func () {
    }
    func()

    2. 变量声明提升(只有var声明的变量才有变量提升,let、const无;变量赋值无提升)

    1. console.log(num)
       var num = 10
    
    2. console.log(func)
       var func = function () {
       }

    上两例均会打印出 'undefined',变量声明提升会将变量声明提升到作用域顶部,但只会提升声明部分,不会提升赋值部分,实际提升后结果如下:

    1. var num 
       console.log(num)
       num = 10
    
    2. var func
       console.log(func)
       func = function () {
       }

    3. 进阶举例(两者优先顺序、局部与全局变量):

    var func = 10
    console.log(func && typeof(func))
    function func () {
    }
    
    -----
    
    console.log(func && typeof(func))
    function func () {
    }
    var func = 10

    上两例将分别输出 ‘number’、'function',原因是 函数声明提升优先于变量提升,函数声明会被变量赋值影响,但不会被变量声明影响,实际提升后结果如下:

    function func () {
    }
    var func = 10
    console.log(func && typeof(func))
    
    -----
    
    function func () {
    }
    var func
    console.log(func && typeof(func))
    func = 10

        ②

    num = 10
    function func () {
        window.num = 5
        console.log(num)
        var num
        console.log(window.num)
    }
    func()

    上例将会分别打印出 'undefined'、'5',第一处为局部变量,第二处为全局变量,实际提升后结果如下:

    function func () {
        var num
        window.num = 5
        console.log(num)
        console.log(window.num)
    }
    var num
    num = 10
    func()

     

    欢迎关注、点赞

    展开全文
  • 变量声明提升1、变量定义可以使用var定义变量,变量如果没有赋值,那变量的初始值为undefined。2、变量作用域变量作用域指变量起作用的范围。变量分为全局变量和局部变量。全局变量在全局都拥有定义;而局部变量只能...
  • javascript中的作用域和变量声明提升

    千次阅读 2020-04-28 10:12:48
    一、变量的作用域 JavaScript的this总是指向一个明确的对象,这个对象是在执行的时候动态绑定的。通俗的说就是谁调用我,我的this就是谁。 除去不常用的with和eval,具体的实际应用中,this的指向分为以下四种情况:...
  • 我们都知道 js 中函数声明会提升变量声明提升(赋值不提升)。那为什么会这样呢,这就涉及到 js 预编译。 js 运行三部曲 语法解析——检查有无语法错误; 预编译; 解释运行——将 js 翻译成计算机识别的...
  • 1、变量声明提升 在C++、java中必须先声明变量才能在后面使用这个变量,但是在JS中,无论在该作用域中的哪个位置声明变量,都会被提升到顶部,但是变量定义不会跟着提升; console.log(person1)//undefined变量...
  • 然后根据具体的例子比较变量声明提升和函数声明提升的不同。 第一部分:函数的声明方式 函数声明有三种方式:函数声明,函数表达式(又称函数字面量声明),函数对象的声明(使用率很低)  方式一:函数声明 ...
  • js代码执行过程 1.先扫描全局语法是否有错误,有错则报错并停止扫描 2.无错则进行预编译过程  创建全局GO对象 global object  对var声明的变量进行声明提升但... 找形参和变量声明,将变量和形参名作为AO属...
  • 变量声明(定义变量)提升: 在预编译阶段,编译器会把所有定义的变量全部提升到最顶部,即,把变量声明的语句会自动放置到开始。换句话说,经过预编译后,在任何函数里,一开始是全部的变量声明。//示例一: /* ...
  • --------------------------预编译阶段--------------------------------------------- //编写代码 ---预编译---》编译执行...//2、变量声明提升 //3、函数的处理 //4、优化。   //5、等等       ---...
  • js中函数声明提升还是变量提升 根据官方书籍《你不知道的javascript》(上卷)中写道: “函数会首先被提升,然后才是变量”。 例子: console.log(foo); function foo(){ console.log("函数声明"); } ...
  • 变量声明和变量提升

    千次阅读 2018-05-31 13:57:29
    1.作用域 变量起作用的范围就是变量的作用域。在JavaScript中唯一能产生作用域的东西是函数。 1)块级作用域:使用代码块限定的作用域。JavaScript中没有块级作用域 ...作用域规则首先使用提升规...
  • 在 你不知道的JavaScript(上卷) 一书的第40页中写到:函数会首先被提升,然后才是变量
  • JavaScript变量声明提升

    2021-03-16 17:54:41
    这造成的结果,就是所有的变量声明语句,都会被提升到代码的头部,这就叫做变量提升。 示例: console.log(a) // undefined var a = 1 function b() { console.log(a) } b() // 1 上面的代码实际执行顺序是...
  • 变量声明提升和函数整体提升(变量声明提升的时候,只提升变量名,不提升变量值) //3.函数范围内,照样适用。 console.log(aaa); //变量提升 undefined var aaa = 111; fn8(); function fn8(bbb){ //变量声明...
  • console.log(typeof a) // ...函数声明提升先于变量声明提升 只提升了声明,没有提升赋值 function a() {} var a//a重复声明而不予理会,所以a的类型在输出时依旧为function console.log(typeof a) a = 1 ...
  • 今天在群里看到了一道题,如下。问输出什么? var c = 1; function c(c) { console.log(c); var c = 2;...原来在一个作用域中,变量声明是有顺序的:函数形参声明--->函数声明---->变量声...
  • 函数声明提升高于变量声明 //同时声明变量a和函数a var a; function a() {} alert(typeof a); //显示的是"function",初步证明function的优先级高于var。 //先声明函数后声明变量,证明上边的例子不是...
  • 1、ES6提供的6种变量声明方法 2、6种变量声明方法的区别 3、关于变量提升、函数提升的概念 学习笔记: es5只提供了两种声明变量的方法,即var和function。 ES6 除了添加let和const命令,还有两种声明变量的方法:...
  • 本文主要给大家介绍了关于JavaScript中Hoisting(变量提升与函数声明提升)的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。 如何将 函数声明 / 变量 “移动” 到作用域的顶部。 术语 ...
  • 1. 变量声明提升  先看以下代码: 1)var in_window = "a" in window; console.log(in_window); 2)var in_window = "a" in window; console.log(in_window); if(!("a" in window)) { var a = 1; } 3)var a; ...
  • 参考文档 ...js函数 会先扫描整个函数体语句,将所有声明变量提升到函数的顶部, 但是不会提升赋值. func

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 150,406
精华内容 60,162
关键字:

变量声明提升

友情链接: log.zip