一、作用域:
    是编程语言中,规定变量储存和访问的规则
    js中作用域有三种: 全局作用域函数作用域块级作用域(es6新增)。
    内层作用域可以访问到外层作用域的变量,以此形成的作用域层级引用关系就是作用域链,如果在全局作用域也没找到一个变量,js引擎会抛出错误。

    二、闭包
    引用着另一个函数作用域中变量的函数,就叫闭包;通俗理解就像在外太空穿着太空服的宇航员,需要一个生存环境,闭包就是绑定了执行环境的函数。
    自由变量访问:访问本作用域外的变量,在函数定义处查找,不是在调用的地方。
    关于闭包的经典考题:
    (1)将内部函数返回到全局作用域

    1. function create(){
    2. let a = 100;
    3. return function(){
    4. console.log(a)
    5. }
    6. }
    7. let a = 300;
    8. let outterCreate = create();
    9. outterCreate()
    1. 2)将函数作为参数,传入函数内部执行
    1. function myFoo(){
    2. console.log(a)
    3. }
    4. let a = 100;
    5. function foo(fn){
    6. let a = 200;
    7. fn()
    8. }
    9. foo(myFoo)

    闭包应用场景
    数据缓存,将缓存数据隐藏在函数内部,向外界提供储存和访问数据的方法。

    1. function myCache(){
    2. let cache = {};
    3. return {
    4. set(key, val){
    5. data[key] = val
    6. },
    7. get(key){
    8. return data[key]
    9. }
    10. }
    11. }
    12. let cacheTool = myCache()

    三,this指向
    普通函数的this指向是在执行时绑定,箭头函数的this指向取外层作用域的this
    (1)作为普通函数直接调用,函数内部this指向window
    (2)作为对象的方法调用,指向该对象
    (3)setTimeout的回调函数中,普通函数内部的this指向window,箭头函数定义时绑定外层作用域this。
    (4)call、apply和bind,可以直接改变this
    (5)class类中,this指向实例对象
    (6)dom事件触发函数中,this指向事件dom节点

    四、bind函数手写

    1. Function.prototype.myBind = function () {
    2. let thisArg = arguments[0],
    3. originArg = this,
    4. thisArgObj = Object(thisArg),
    5. outterParameters =
    6. arguments.length > 1 ? [...arguments].slice(1) : [],
    7. myBindFuncitonName = symbol("myBind");
    8. thisArgObj[myBindFuncitonName] = this;
    9. return function () {
    10. let innerParameters = [...arguments],
    11. allParameters = [...outterParameters, ...innerParameters];
    12. return thisArgObj[myBindFuncitonName](allParameters);
    13. };
    14. };
    15. let fn2 = fn1.bind(obj, 1);
    16. fn2(2, 3);