变量提升、作用域、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为止。

posted @ 2022-08-22 08:41  笔下洛璃  阅读(23)  评论(0编辑  收藏  举报