js 高级

  学习地址:https://www.bilibili.com/video/BV16441137wW?from=search&seid=7826458658326456754 (音质不太好,质量不错)

  单词:

 anonymous [ə'nɒnɪməs]  匿名的  watch 监视;视察 call 调用  stack 栈  breakpoint 断点  pause 暂停 
 scope 作用域;范围  global 全局的;全球的  local 局部的  context 上下文  excution 执行  hoisting [ˈhɔɪstɪŋ] 提升
 clousure  ['kləʊʒə] 关闭;闭包  chain  [tʃeɪn] 链  scope chain 作用域链   excution context 执行环境  excution context stack 执行环境链  variable object  变量对象
 active object 活动对象  memory 内存  IIFE 立即调用函数表达式  super 父类型  subtype 子类型  propotype 原型
 instance 实例  module 模块  lifecycle  生命周期  OOM  out of memory 内存溢出  memory leak 内存泄漏  process 进程
 thread 线程  thread pool 线程池  webkit  谷歌浏览器内核  gecko 火狐内核  trident IE内核  engine 引擎
 callback 回调  queue 队列  loop 循环  task 任务  driven 驱动  worker 工作者

一、基础巩固

  1)数据类型 : js是弱类型语言,无法通过变量(等式左边)直接看出数据的类型

    1、基本数据类型    Number    String    Boolean    Null    Undefined  Symbol(ES6新增)

       引用数据类型    Object

    2、"typeof ":  可以区分:Number  String Boolean Undefined Symbol  Fuction   

            不可区分:Null  和  除Fuction外的对象  返回都是object

         "instanceof": 可以区分:Object    (底层判断原理:右边的显示原型对象是否在左边隐式原型对象链上)

       "===":           可以区分:Null      Undefined      比如:null === undefined;// false

  2)数据_变量_内存

    在使用变量的时候,一定要明确变量指向的是什么数据类型(基本?引用?)。

    我一般把js传递看作值传递,只是引用数据类型时,传递的是引用地址,修改对象,会受影响。

  3)对象

    1、 原生对象/内置对象 :    Array、Boolean、Date、Function、Global、Math、Number、Object、RegExp、String

           宿主对象/浏览器对象: Window  、Document 、Navigator 、Screen 、Location

        自定义对象:                自定义的对象

    2、获取对象的属性值得方式  var obj = {name : '小明'};

      obj.name //仅仅用于获取属性值

      obj[name] //设置对象属性名为变量时,只能用中括号。且中括号内一定会自动调用tostring方法。

    3、对象的key一定是字符串,只是我们一般省略掉引号。由于对象的tostring方法返回[object Object]  因此

      a[obj1] = 4;  a[obj2] = 5; console.log(a[obj1]);   // 输出5

  4)函数(四种调用方式)

    fun()                                       自调用,this指向window

    var obj = new fun()                构造函数,所有的函数都可以看做构造函数。this指向调用该函数的实例对象

    setTimeout(fun,3000)            回调函数,fun不需要加括号哦

    fun.call(obj) /fun.apply(obj)   强制改变this指向obj

  5)回调函数

    我定义的;我没有直接调用;一定条件满足后会被调用

    如:事件触发函数,定时器函数

  6)IIFE

    (function(){})()

  7)this   

    指向调用函数的对象(注:this不是由定义决定,由调用时决定) 

       

二、函数高级

  1)原型与原型链

    1、所有对象都有_proto_(隐式原型对象)

    2、所有函数对象都有prototype(显示原型对象)

    3、实例对象的_proto_指向对应函数对象的prototype

    原型链图解

    

     总结:一个对象可以获取到它直接和间接父类中prototype及prototype中的方法

      此总结能简化很多查找方法的过程,适用于大多数情况,但是改变了prototype的指向的情况要注意,这种情况较少,可忽略。

  2)执行上下文和执行上下文栈

    1、执行上下文定义:js引擎在执行js代码前会创建执行环境,在执行环境中做预处理工作

       创建空对象

          该空对象用于收集变量、函数、函数参数(找var和function)  :

        有一种情况同名变量和函数,打印类型时函数,一种解释为函数优先级高,我同意视频看法---函数预处理赋值了的,变量预处理赋值为undefined,可以理解为未赋值。

          创建作用域链

          确认this的指向

    2、执行上下文栈

      用于保存执行上下文对象

    学习内容我未做笔记,可以通过下面这道题检测自己是否明白执行上下文和执行上下文栈的知识

    

     这道题涉及:变量提升、执行上下文栈的压栈出栈、局部执行上下文

   3)作用域和作用域链

    1、作用域用于隔离变量,形成相对独立的变量作用区域。分为全局作用域和局部作用域(函数作用域,不是对象哦)。

    2、作用域产生的时机是 代码定义时,代码定义时,代码定义时(这句话的意思是查看多个函数作用域的关系时,看定义时的关系而非调用关系)

    3、销毁时机:局部---函数调用完毕  全局---关闭浏览器

    4、作用域链:先当前作用域查找,再向外层逐层查找,直到全局,若一直没有,报错  xxx is not defined

    5、作用域是静态的,代码定义就会产生,仅一个。执行上下文,是动态,代码执行之前产生,可以有多个。

  4)闭包

    1、闭包定义:是一个闭合的容器对象

    2、形成条件:函数嵌套;内部函数使用外部函数变量

    3、作用:外部访问函数内部的变量

    4、缺点:占内存,可能会导致内存溢出

    5、使用场景:

      解决循环遍历加监听的问题

      将内部的函数返出来

      将函数作为实参传递给另一个函数调用

    闭包测试:

    

 未完待续。。。。。

    

  

原文地址:https://www.cnblogs.com/LiuChengGang/p/14380227.html