• 2 —— js语法 —— 对象和方法的声明 。变量提升。闭包


    一,声明对象

    var obj1 = {};

    var obj2 = {name:'kk',age:18,fun:function{          // name,age,fun为对象的属性,只是属性值不同

      console.log(123); 

      return 1;

    }};

    console.log(obj2.fun)     //  获取的是对象属性,为 函数体
    console.log(obj2.fun())   // 执行函数
     
    ——————————————————————————————————————————————————

    二,声明函数
     
    1, 直接量 :             function f1(){}
    2, 表达式声明 :      var f2 = function(){}
    3, 内置构造函数 :   var f3 = new Function(){}     // 构造函数首字母大写。  此函数声明方法很少用,了解即可
     
    (一)function f1(){} 和 var f2 = function()  的 区别
    1,直接量声明 有变量提升 。 声明前后都可以调用
    2,表达式声明 也是有变量提升。但是赋值并没有被提升。   所以表达式声明 必须要在声明后才可以调用

    二)JavaScript 变量提升

    1,JavaScript 中,函数及变量的声明都将被提升到函数的最顶部。

           JavaScript 中,变量可以在使用后声明,也就是变量可以先使用再声明。

    2,JavaScript 只有声明的变量会提升,初始化的不会。

    (三)函数在运行过程中一旦遇到 return 。就会结束执行

    ——————————————————————————————————————————————————


    三,函数在 js 中的意义及作用

     

    1,在 js 中,函数是一等公民 

    2,因为 在 js 中 , 函数是一个特殊的数据类型  

    3,数据类型在任何语言中都是一等公民

    4,函数是一个值, 可以和字符串,数组,对象等数据类型 同等方式使用

    function f1(v){
    console.log(v)
    }

    var f2 = function(){
    return 123;
    }
     
    f1(f2())
     
    (一)将函数当作值使用的好处 
     
    当做一个实参传到另一个函数里面时,形成了 回调函数
     
    (二)回调函数  ( nodejs中大部分使用的就是回调函数 )
     
    var a = 1

    function f1(v){
      var a = 2
       f2()
    }
     
    function f2(){
          console.log(a)
    }
     
    f1(f2())
     
    // f2被称作回调函数。 原因 : 函数自身的作用域在声明的地方,而不是在调用的地方
    // 函数在哪声明,就在哪执行
    // f2 的作用域是在全局下
    // 虽然是在f1里调用的f2 。 但是 它需要出来找到 f2方法执行 。所以它是回调函数
    // 它是在全局作用域里找 , var a = 2 是在局部作用域下 。 所以它找不到 var a = 2
     
    (三) 闭包
    var a = 1

    function f1(f2) {
    var a = 2
    function f2() {
    console.log(++a)
    }
    return f2
    }
     
    // 由于 f1 的运行结果是返回 f2
    // 又因为 作用域链 和 函数自身作用域 的问题
    // 导致 f1 运行结束后 不能销毁变量
    // 因此形成了闭包
     
    /*
        直接返回一个函数是最常见的一种闭包的形式
    */
     
    var f = f1()

    f()
    f()
    f()
    f()
     
    -----------------------------------------------------
     
    // 先找到 f2() 声明的地方,然后再找 a
    // 函数结束变量被销毁
    // 作用域链 : 向上寻找
    // 闭包
     
    /*
    形成的原因 :
     
    当f1运行完后变量 a 会被销毁 。 但它发现后面的函数需要用到这个变量 。所以 js 解析引擎对于 f1里的 var a = 2
    这个变量 不能销毁 。

    为什么不能销毁 : 因为后面的 f2 函数需要用到这个变量

    当 f1 函数一旦执行 , return 出去一个函数 。 此时就形成了一个闭包 。

    f1 函数虽然执行完毕,但由于其执行过程中生成的那些变量和数据不能被销毁 。 所以这些数据就会常驻内存 。
     
    此时 f2 函数一执行 。 它就会从刚刚 f1 执行后遗留的内存(或缓存)中 调用数据

    个人理解 : 闭包就是把数据封闭起来 。 防止其销毁 。 后面还可以再内存中找到使用
     
    */

    /*
       
    闭包的两大作用和两大作用域 :

    1,保留环境的作用域
    2,外部和内部的桥梁

    */
     
     
  • 相关阅读:
    eclipse和jdk版本对应问题
    2017第49周四黑珍珠的价值
    如何写python插件、包,放到pypi上供其他人使用
    zerorpc的安装
    httplib 和 httplib2区别之 gzip解压
    mac下报错 xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
    使用zerorpc踩的第一个坑:
    Jmeter Summariser report及其可视化
    sublime快捷键设置
    来,来,来,哥哥告诉你一个把文件搞大的方法
  • 原文地址:https://www.cnblogs.com/500m/p/10914249.html
Copyright © 2020-2023  润新知