JavaScript常问面试题(持续更新中)
this,作用域,闭包
1. 谈谈对 this 指向问题的理解
- 
JS中this的指向非常灵活,会根据函数的调用方式和所处环境不同而发生变化 
- 
this关键字用来指代当前执行环境的上下文 
- 
this永远指向一个对象 
- 
this的指向取决于函数调用的位置,或通过call,apply,bind修改 
- 
this指向跟调用有关,跟定义无关 
2. 手写实现 call、apply、bind 函数(apply只是传入参数为数组)
//手写实现call
Function.prototype.selfCall = function( context, ...params ) {
    context == null ? context = window : null
    !/^(object|function)$/.test( typeof context ) ? context = Object(context) : null
    //定义唯一的key
    let _this = this, result = null, UNIQUE_KEY = Symbol('UNIQUE_KEY')
    context[UNIQUE_KEY] = _this
    result = context[UNIQUE_KEY](...params)
    delete context[UNIQUE_KEY]
    return result
}
//手写实现bind
Function.prototype.selfBind = function( context, ...outParams ) {
    let _this = this
    return function(...innerParams) {
        _this.selfCall( context, ...outParams.concat(...innerParams ))
    }
}
3.什么是闭包?闭包有什么作用?
- 
在一个函数中访问另一个函数作用域中变量的方法 
- 
闭包的作用:函数外部可以访问到函数内部的变量;跨作用域,创建私有变量;已经运行结束的逻辑,依然残留在闭包里; 
原型继承
1.简单说说原型和原型链
- 
构造函数:Js中用来构造新建一个对象的 
- 
构造函数内部有一个属性prototype(原型) => 值是一个对象 => 包含了共享的属性和方法 
- 
使用构造函数创建对象后,被创建对象内部会存在一个指针(__proto__) => 指向构造函数prototype属性的对应值 
- 
原型链实际上是为了节约内存的一种寻祖现象,链式获取属性规则: 对象的属性 => 对象内部本身是否包含该属性 => 顺着指针去原型对象里查找 => 在往上层级里去查找 
2.new操作符做了什么?
- 创造一个新的对象
- 将构造函数的prototype属性设置为新对象的原型
- 将新对象作为this调用构造函数
- 如果构造函数返回一个对象,则返回该对象;否则返回一个新对象
 话不多说,手写一个new
function myNew(constructor, ...args) {
  let obj = Object.create(constructor.prototype);
  let res = constructor.apply(obj, args);
  return res instanceof Object ? res : obj;
}
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号