作用域、上下文、闭包、原型、继承
什么是作用域?
(1)在JavaScript里,域指的是代码当前的上下文语境
(2)javascript中作用域分为:全局作用域和本地作用域
本地作用域:
(1)整个页面,全局域只能有一个
(2)全局域有一个内置对象,window
(3)所有全局域的变量和方法都绑定到window对象上
本地作用域(函数作用域):
(1)本地域是指那些在全局域中定义的域
(2)本地域通常指的是函数作用域,在函数内部定义的变量和函数
(3)本地域的函数和变量无法在这个域的外部被访问
注意:
块级作用域:一般编程语言中以大括号{}为一个块进行分离,每一个{}为一个块作用域
Javascripe中不存在块级作用域之说
什么是上下文?
想要了解什么是上下文,就先要了解函数的执行过程。函数的执行过程分为两个阶段:预处理阶段和执行阶段。
预处理阶段:
(1)全局词法环境(lexical environme)也就是执行上下文环境;
(2)用于存储预处理数据;
(3)预处理数据包括:var方式定义的变量和声明方式定义的函数;
(4)var方式定义的变量直接赋值undefine,声明方式定义函数赋值整个函数体,this赋值
预处理覆盖问题解析(函数以声明方式进行定义)
(1)如果后声明的函数名和之前声明的函数名冲突,冲突函数后面的会覆盖前面的
(2)如果后声明的函数名和定义的属性名冲突,冲突函数后面的会覆盖前面的
(3)如果后定义的属性名和之前声明的函数名冲突,则会忽略属性定义
执行阶段:
(1)从js代码块的第一行开始执行,并给词法环境中的变量赋值
(2)如果变量在词法环境中不存在,则往词法环境中加入变量并赋值
执行阶段覆盖问题
(1)执行阶段不会再处理声明方式定义的函数
(2)声明方式定义函数不会覆盖任何定义的函数和属性
(3)后赋值的属性会覆盖先赋值属性内容
什么是闭包:
闭包就是指外部能够随意读取其他函数内部变量的函数
也可以理解成“定义在一个函数内部的函数”
闭包是将函数内部和函数外部连接起来的桥梁
闭包的作用:
(1)可以读取函数内部的变量,减少全局变量定义
(2)减少函数传递参数的数量
(3) 让函数内部变量的值始终保持在内存中,不会在函数调用完毕后被自动清除
闭包使用注意事项:
(1)闭包使用父函数变量时候,只是个引用,而不是复制
(2)父函数每调用一次,会产生不同的闭包
(3)闭包中循环的问题
(4)闭包的自执行格式写法
自执行函数(立即执行函数):
原理:括弧()和JS的&&,异或,逗号等操作符能在函数表达式和函数声明上消除歧义
格式:(1)调用函数,得到返回值。强制运算符使函数调用执行
(2)调用函数,得到返回值。强制函数直接执行再返回一个引用,引用再去强制执行
(3)通过一些操作符,来把声明强制转化为表达式,并执行
什么是原型:
原型是指prototype:JS中所有的静态属性全部定义在当前构造函数的原型(prototype)中
prototype原型:
(1)任何函数都是对象
(2)任何函数都会有个默认自带属性:prototype,称之为原型
(3)prototype指向的是一个对象,对象称之为原型对象
(4)原型对象内部封装了唯一一个默认属性constructor,称之为原型构造器
(5)原型构造器指向的是当前函数本身
关于prototype原型要讲的东西比较多,在这里就不深入研究了。
继承:
定义:一个类中直接拥有另外一个类中的属性和方法的过程
注意:JS中的继承不伦不类,大不要以高级面向对象语言的思维来思考JS继承
JS中的继承方式多种,具体分类如下:
(1)对象继承:深度拷贝完成继承
(2)类的继承:call/apply方式、原型链方式、混合模式、桥接混合模式