作用域
作用域用于定义变量所处位置、限定变量的可用范围。
作用域类别:
全局作用域:window对象。
函数作用域:function内部。
块级作用域:一对大括号 条件语句 循环语句等 。
脚本作用域:用let和const在script标签中声明 变量 没有存储在window对象中 避免全局污染。
作用域链
作用域和作用域之间的相互关联 共同构成了作用域链。
特点:作用域链是线性有序的(它保证了变量的有序访问)。
作用域链顶端 就是全局作用域。
延长作用域链:try catch语句的catch块。
闭包
本质是函数作用域 它存储在了当前函数对象中的scope
属性里(Closure 指向另外一个函数作用域的活动对象–活动对象中存储了对应函数的全部信息)。
闭包使当前函数作用域有权访问另外一个函数作用域的变量和函数。
常见的创建闭包的方式 :函数作用域的嵌套。
作用:避免全局污染。
缺点:可能会造成内存浪费,因为作用域嵌套后 在内层函数中存在外层函数的活动对象,只有当内层函数代码执行完毕后 外层函数的活动对象才会被销毁。
原型 prototype
每一个对象都有一个原型属性 它用于关联另一个对象。
关联后能使用另一个对象的属性和方法(原型式继承)。
原型链 __proto__
对象通过原型关联在一起 原型内有一个__proto__
属性用于关联其他的原型。
如果读取对象的一个属性, 对象中没有此属性则会自动到 __proto__
中查找此属性。
new关键字的作用
new关键字可以理解成创建对象的语法糖写法。
1.在函数内声明一个叫this的变量 并赋值为空对象。
2.设置this的属性__proto__ = 函数.prototype。
3.return this变量。