• JS函数和声明提升


    函数的定义与调用

    语法:

    function 函数名(形参1,形参2,...){
        代码块;
        return 返回值;
    };
    

    匿名函数:

    var f1 = function(形参1,形参2,...){
        代码块;
        return 返回值;
    }
    f1(1,2)
    

    立即执行函数:

    (function(a, b){
        return a + b;
    })(1, 2);
    

    函数中的arguments参数

    在函数体内通过arguments对象来访问参数数组,从而获取传给函数的每个参数。可以通过索引取到参数。

    function add(a,b){
      console.log(a+b);
      console.log(arguments.length)
    }
    
    add(1,2)
    
    3
    2
    

    注意:函数只能返回一个值,如果要返回多个值,要放在数组中或对象中。

    函数的全局变量和局部变量

    • 局部变量:在JS函数内部声明的变量(使用var)是局部变量,所以只能在函数内部访问它,该变量的作用域是函数内部。函数执行完毕,局部变量就会被删除。
    • 全局变量:在函数外声明的变量是全局变量,网页上的所有脚本和函数都能访问它。

    变量生存周期

    JS变量的生命期从他们被声明的时间开始,局部变量会在函数运行完毕后删除,全局变量会在页面关闭后删除。

    作用域

    函数的作用域关系在定义阶段就以确定,与调用位置无关。

    首先在函数内部查找变量,未找到则到外层函数查找,逐步找到最外层。

    var city = "BeiJing";
    function f() {
      var city = "ShangHai";
      function inner(){
        var city = "ShenZhen";
        console.log(city);  // 局部存在则在局部查找
      }
      inner();
    }
    
    var city = "BeiJing";
    function Bar() {
      console.log(city);
    }
    function f() {
      var city = "ShangHai";  // 在局部定义的变量,并非修改全局的变量
      return Bar;
    }
    var ret = f();
    ret();
    
    var city = "BeiJing";
    function f(){
        var city = "ShangHai";
        function inner(){
            console.log(city);  // 局部存在则在局部查找
        }
        return inner;
    }
    var res = f();
    res(); 
    

    JS中的变量提升和函数提升

    在ES6之前,js是没有块级作用域。

    img

    在JS中,代码的执行是分两步走的,1、解析。2、一步一步执行。

    变量提升就是变量声明会被提升到作用域的最顶上去,也就是该变量无论是在作用域的哪个地方声明的,都会提升到作用域的最顶上去。

    img

    上面这种写法其实等价于下面这种写法:

    img

    看几个例子:

    img

    把上面的例子稍作改动,结果就会大不一样,

    img

    再看一个例子:

    img

    函数提升

    函数声明式,会将函数的声明和定义一起提升到作用域的最顶上去。

    img

    输出结果:

    生命不息 奋斗不止
    ƒ fn(){
        console.log('生命不息 奋斗不止');
    }
    生命不息 奋斗不止
    

    如果是这种写法:函数表达式声明的函数

    img

    输出结果:

    ƒ fn(){
        console.log('生命不息 奋斗不止');
    }
    ƒ fn(){
        console.log('生命不息 奋斗不止');
    } 
    

    最后一个例子

    img

    输出结果:

    ƒ fn(){
        console.log('生命不息 奋斗不止');
    }
    hello
    

    总结:

    • 1、所有的声明都会提升到作用域最顶上去。
    • 2、同一个变量只会声明一次,其他的会被忽略掉。
    • 3、函数声明的优先级高于变量声明,并且函数声明和函数定义部分一起被提升。
  • 相关阅读:
    mysql清空表中内容
    Proteus元件查找
    HDG12864F1 proteus仿真取模【PCtoLCD完美版】
    OLED取模(汉字加图片)
    Failed to connect to ESP8266: Timed out waiting for packet header
    AD常用快捷键
    Authentication method 'caching_sha2_password' not supported by any of the available plugins.
    spark阶段学习总结(三)
    spark阶段学习总结(一)
    spark阶段学习总结(二)
  • 原文地址:https://www.cnblogs.com/ChiRou/p/14520789.html
Copyright © 2020-2023  润新知