2020.4.25 Javascript精进

发布于 2020-04-25  15 次阅读


1.复习内容

2.灵感代办

  • 怎么把知识转化
  • 学到的知识,怎么运用
  • 闭包详解课程未上完

3.学习内容

  • 作用域精解

    • 函数预编译

    • [[scope]]:

      • 每个JavaScript函数都是一个对象,这个对象中有些属性只能供JavaScript引擎访问,[[scope]]就是其中一个
      • [[scope]]指的就是我们所说的作用域,其中存储了运行期上下文的集合
    • 作用域链:

      • [[scope]] 中所存储执行期间上下文对象的集合,这个集合呈链式连接(链式存储)
      • 作用域链类似栈,后进先出
      • .jpg)
    • 查找变量

      • 一个函数创建时候,就已经有[[socpe]],里面存放的是它所在环境的上下文变量(window)GO
      • 这个函数自己定义了AO,查找变量先在自己AO对象中查找,然后依次
      • 创建一个函数,就要在scope中拿外层[[socpe]]的引用,然后在函数运行时增加自己的AO
      • 函数执行完,要销毁执行上下文(自己的AO对象)

        把指针定义删除

    闭包:

    • 原理:
      • 内部函数被保存到了外部,一定会生成闭包
      • 因为内部函数会拿到外层[[scope]]的引用
    • 缺点:
      • 闭包容易造成内存泄漏(该释放的不释放)
      • 内存泄漏:占用的内存多了可以使用的就少了
    • 解决缺点
      • 添加一个立即执行函数,里面执行代码
    • 闭包的应用
      • 累加器 就是闭包实现的
      • 缓存:就是一种存储结构
      • 封装;属性私有化
  • 立即执行函数

    • 表达式(执行)

      • 只有表达式可以被执行符号(小括号)执行
      • 能被执行符号执行的表达式,函数的名字就会被忽略(变成了立即执行函数)
      • +,-,!,=,与,或,都可以把函数变为立即执行函数(放弃了函数名字)
      • ,也是一个运算符,返回后面的值
      • https://blog.csdn.net/weixin_33861800/article/details/92056387
    • 用处:

      • 函数都有作用域
      • 用来初始化一些值
      • 用来处理一些数据,只要返回值
    • 语法:

      • (function(){})(参数)建议使用
      • (function(){}())
      • 一般都要接收返回值
    • 特性:

      • 执行完毕就被释放
      • 避免污染全局变量
  • 对象

    • JavaScript对象增加删除方法

      • 1.在函数内部定义
      • 2.对象.方法 = func
      • 3.删除一个对象 delete
    • 对象创建的方法

      • 1.对象字面量

        • var obj = {} plainObject 对象字面量/对象直接量
      • 2.构造函数

        • new 一个函数 ,
          • 如果没有返回值,就是返回this
          • 这个函数返回值如果是字面量,就忽略该值
          • 如果返回引用值,this被替换为返回的引用值
        • 系统自带的构造函数(Array Number)
          • var obj = new Object();
          • 写法上没有什么区别
        • 自定义的构造函数
          • 构造函数和java等的构造函数意义不一样
          • 构造函数一般是大写开头
          • 和函数没有任何区别,就是需要new
        • new构造 函数三步(隐式三步转换)
          • var this = {}
          • 把函数内参数赋值
          • return this
    • 包装类

      • Number() Boolean() Number()
      • 类似java的装箱操作
      • 原始值被相应的对象包装起来
      • 比如调用length,原始值被包装起来

4.扩展延伸知识

  • python中的函数和JavaScript的函数不同

    • 因为python是缩进,所以不能直接把函数定义给数组,要把定义的函数名,给数组
    • 可以给数组lambda函数
  • javascript使用单引号还是双引号

    • php没有双引号,所以最好使用单引号
  • JavaScript对象与java对象的区别

    • 创建可以添加任何属性,删除属性
  • typeof六个值

    • String Number Boolean Object undefined function,symbol ES6新加入
  • 变量提升过程

    • 第一步创建AO对象,(AO = {})Activation Object(执行上下文)
    • 第二步找形参和变量声明作为AO对象的属性,值都是undefined(AO = {a :undefined} )
    • 第三步将实参和形参相统一
    • 第四步把函数声明赋给AO对象里对应的属性
    • 预编译不止发生在函数中,也发生在全局中,省略第三步,生成的对象是GO(Global Object)
    • 在执行的时候,变量自动赋值,函数要判断是否被调用
    • 只要有方法和变量重名,那么这个值一定是方法,后定义的覆盖先定义的
  • function(){}(1,3,4)执行结果是
    • 什么也不输出,
  • parseInt(3,2)的含义
    • 二进制的3,转换为十进制

5.知识内容个人梳理

  • 手写几个作用域链
    function test(){
      var test = 100;
      function a(){}
      function b(){}
    }

6.今天都复习了之前的什么内容


Ares个人进阶之路