变量提升、作用域、arguments、instanceOf
变量提升、作用域、arguments、instanceOf
变量提升
JS是单线程语言,所以执行肯定是顺序执行。但并不是逐行分析和执行,而是一段一段地分析执行,会先进行编译阶段然后才是执行阶段。在编译阶段,代码真正执行前的几毫秒,会检测到所有的变量和函数声明,所有这些函数和变量声明都被添加到名为Lexical Environment的JS数据结构的内存中。因此,这些变量和函数能够在它们被声明之前被使用。
使用var声明的变量和函数,都存在变量提升。
作用域
作用域简单来说,就是一个独立的地盘,让变量不会外泄、暴露出去。也就是说,作用域最大的作用就是隔离变量,让不同作用域下的同名变量不会有冲突。
ES6之前,JS只有全局作用域和函数作用域。ES6的到来,提供了块级作用域,可以使用let和const来体现。
arguments
在js中,每个函数都会有一个Arguments对象实例arguments,引用着函数的实参。它是寄生在js函数当中的,不能显式创建,arguments对象只有函数开始时才可以用。它是一个类数组数据。
有了arguments这个对象之后,我们可以不用给函数预先设定实参,可以动态地通过arguments为函数加入参数。
instanceOf
instanceOf的作用就是判断一个实例是否属于某种类型。
原理:
function new_instance_of(leftVaule, rightVaule) {
let rightProto = rightVaule.prototype; // 取右表达式的 prototype 值
leftVaule = leftVaule.__proto__; // 取左表达式的__proto__值
while (true) {
if (leftVaule === null) {
return false;
}
if (leftVaule === rightProto) {
return true;
}
leftVaule = leftVaule.__proto__
}
}
只要右边变量的prototype在左边变量的原型链上即可。
因此,instanceof在查找的过程中会遍历左边变量的原型链,直到找到右边变量的prototype为止。