js基础

88 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第22天,点击查看活动详情

函数中各种this的情况

函数的角色this的指向
普通函数window对象
事件处理程序事件源
定时器的回调函数window对象
对象的方法实例对象
构造函数实例对象

如果还遇上更多的情况,想要知道this是不是我们想要的,输出看看

闭包

什么是闭包:一种编程技巧,可以让局部作用域的数据有效范围增加

具体表现为两点:

1.保护数据

2.缓存数据

保护数据的实现过程

// 1 需要先写一个外部的函数
function f1(){
  // 2 在外部函数的局部作用域里面声明一个数据
  var a = 10;
  // 3 声明一个内部函数
  function f2(){
    // 4 在内部函数里面,操作外部函数的局部变量
    a++;// 具体逻辑自己决定
  }
  // 5 把内部函数作为外部函数的返回值
  return f2;
}

缓存数据的实现过程

// 1 需要一个外部的函数
function f1(){
  // 2 在局部作用域先存储一个数据
  var _this = this;
  // 当我我们需要在函数内部的函数里面,得到外部函数的数据的时候,就使用闭包
  function f2(){
    // 直接使用 外部存储的 _this 就是得到了缓存的数据
    console.log(_this);
  }
}

只要是在函数内部访问函数外部的局部变量,都是形成了闭包

闭包的原理

1作用域链

就是多级作用域下的变量的访问规则

1优先使用自己内部的,2如果内部没有,找上一级作用域,直到全局作用,3如果全局也没有,报错

2函数可以作为返回值

为什么函数可以作为返回值 —— 因为函数也是一种数据类型。js里面语法规定,只要是数据类型,就可以作为参数和返回值。

保护数据的时候,用到了两个原理,但是如果是缓存数据的时候,就使用到作用域链