【interview】2020.07.09

1. New操作符具体干了什么

对于const a = new Foo();,new 干了以下事情

  • const o = new Object();    //创建了一个新的空对象o
    o.__proto__ = Foo.prototype;    //让这个o对象的` __proto__`指向函数的原型`prototype`
    Foo.call(o);    // this指向o对象
    a = o;    // 将 o 对象赋给a对象

    用 call 来实现继承,用 this 可以继承 Foo 中的所有方法和属性

  • function Func1(){
        this.name = 'Lee';
        this.myTxt = function(txt) {
            console.log( 'i am',txt );
        }
    }
     
    function Func2(){
        Func1.call(this);    // 执行 Func1,并且 Func1() 中的 this 指向 Func2
    }
     
    var func = new Func2();
    func.myTxt('Geing'); // i am Geing console.log (Func3.name); // Lee

2. 深入Js之我是如何搞懂作用域和闭包的(参考:https://juejin.im/post/5e8d28c0518825739c734dfb#heading-0

作用域:

就是存放 变量 和 函数 的地方

  • ES6之前,js 只有 全局作用域函数作用域

全局作用域中存放了全局变量和全局函数。

每个函数也有自己的作用域,函数作用域中存放了函数中定义的变量

由于变量提升带来的变量会在不被察觉的情况下被覆盖掉、for 循环中本该被销毁的变量没有被销毁等一系列问题

  • ES6 新增的 let 和 const ,实现了块级作用域

作用域链:

参考:https://www.cnblogs.com/tianxiaxuange/p/10200560.html

闭包:

MDN 中对闭包的定义:"函数和对其周围状态(词法环境)的引用捆绑在一起构成闭包。"

在 JavaScript 中,根据词法作用域的规则,内部函数总是可以访问其外函数中声明的变量,当通过调用外部函数返回一个内部函数后,即使该外部函数已经执行结束了,但是内部函数引用外部函数的变量依然保存在内存中,我们就把这些变量的集合称为闭包

比如下面外部函数 foo那么这些变量的集合就称为 foo 函数的闭包 

  • function foo() {
        var name = 'Top'
        let test1 = 1
        const test2 = 2
        var innerBar = {
            getName: function() {
                console.log(test1)
                return name
            },
            setName: function(newName) {
                name = newName
            }
        }
        return innerBar
    }
    
    var bar = foo()
    bar.setName('You')
    bar.getName()
    console.log(bar.getName)

 

3. 在 js 中,查找对象属性的 原型链

 参考:https://www.cnblogs.com/tianxiaxuange/p/10200560.html

4. 

 

5. 

6. 

7. 

8. 

9. 

10. 

原文地址:https://www.cnblogs.com/tianxiaxuange/p/13274273.html