美文网首页
递归 闭包 作用域

递归 闭包 作用域

作者: 江川哇 | 来源:发表于2021-10-14 09:35 被阅读0次
闭包是什么?

定义在函数内部的函数 拿到函数内部的变量?
闭包就是能够读取其他函数内部的函数?

function f1() {
  var a = 10
  function f2() {
    console.log(a)
  } 
  f2()
}
f1()

全局变量存在window上,一直存在,局部变量是在函数作用域的时候存在。

为什么需要闭包?

局部变量是有生命周期的,局部变量无法共享和长久保存,而全局变量可能造成变量污染,当我们希望有一种机制既可以长久保存变量又不会造成全局污染。
闭包的写法:

//闭包特性:返回的是一个函数,并且这个函数对局部变量存在引用,这就形成包含关系,他是可以维持一个变量的存在
function f1() {
  var a = 10
  function f2() {
    a++
    console.log(a)
  }
  return f2
}
var f = f1() //f1()执行的结果就是闭包
f()

//简化写法
function f1() {
  var a = 10
  return function () {
    a++
    console.log(a)
  }
}
var f = f1()
f()
//例子  两个人行走(a,b) 需要有一个状态来存储行走的距离

#利用一个变量给很多个人使用
function f1() {
  var a = 0
  return function() {
    a++
    console.log(a)
  }
}

var a = f1()
var b = f1()
image.png

总结:闭包返回的是一个函数,并且这个函数对局部变量存在引用,这就形成了包含关系,他是可以维持一个变量的存在,最常用的场景是接口请求的封装

二、this指向

window.onload = function() {
  //经典面试题
  var length = 88 //定义变量
  function test() { //定义test()
    console.log(this.length)
  }
  var obj = { //定义obj对象
    length = 99
    action:function(test) {
      test() //88 没有调用者 默认指向window 
      //arguments[0]()等同于 arguments.test()
      arguments[0]()  //2 this 指向arguments =>  this.length=>arguments.length
    }
  }
  obj.action(test,[1,2,3]) //执行obj.action()
}
//答案:88 2
//考核点:this指向
//this指向规则:运行一个函数,有没有调用者
//1、没有调用者,默认指向全局,即window(严格模式下是undefined)
//2、有调用者,指向的就是当前调用者

var length = 88 //定义变量
function test() { //定义test()
  console.log(this.length) //this.length => window.length
}
test() //88 没有调用者,默认指向全局,即window


var length = 88 //定义变量
function test() { //定义test()
  console.log(this.length) //this.length => obj.length
}
var obj = { //定义obj对象
  length = 99
  action:test
}
//obj.action()//99  有调用者,调用者obj

var f = obj.action
f()//没有调用者 this.lenght => window.length


// 扩展题 
var length = 88 //定义变量
function test() { //定义test()
  console.log(this.length) //this.length => arr.length
}
var arr = [test,2,3,4]
arr[0]() //4  arr[0]() =>test()  相当于arr.test() 调用者是arr


//arguments  所有参数集合 类似数组
function f() {
  console.log(arguments[0]);
  console.log(arguments.length);
}
f(1,2,3,4)

没有调用者 this指向window 有调用者this指向调用者

三、作用域

局部变量vs全局变量

1、声明位置不一样:全局变量定义在函数体外面,局部变量定义在函数体里面
2、作用域不同:全局变量作用域是整个程序,局部变量作用域仅限于函数体内部
3、生存期不同 :局部变量用完就删除了,全局变量页面不关闭就不会被删除

块级作用域:js没有块级作用域,函数除外
隐士全局变量VS全局变量

var a = 1 //定义全局变量
a = 1 //定义隐士全集变量 可以被delete(a)
全局变量不能被删除,隐士全局变量可以被删除

四、递归

函数在运行时调用自己的情况,叫做递归
只递不归会导致程序崩溃 (栈溢出)
为了避免崩溃,递归函数中一定要包括条件语句,在合适的时候终止递归

相关文章

  • 作用域和闭包

    目录 概述 作用域编译过程词法作用域全局作用域函数作用域 闭包循环和闭包闭包的用途性能 总结 概述 作用域和闭包一...

  • python基础-08-内置函数、作用域、闭包、递归

    python基础-内置函数、作用域、闭包、递归 1.常见的内置函数 2.函数内变量的作用域 3.内嵌函数和闭包 4...

  • 闭包及装饰器

    递归:是自己调用自己闭包:函数嵌套,并且保存局部作用域变量

  • 递归 闭包 作用域

    闭包是什么? 定义在函数内部的函数 拿到函数内部的变量?闭包就是能够读取其他函数内部的函数? 全局变量存在wind...

  • 2018-01-07 关于javascript闭包和作用域的理解

    关于 javascript 闭包的一些思考 作用域 词法作用域 函数作用域 块作用域 闭包 什么是作用域? 作用域...

  • js作用域、闭包

    闭包 闭包作用 全局 局部 作用域链

  • JavaScript高级程序设计笔记7

    函数表达式 递归 闭包 (1)闭包与变量 (2)关于this对象 (3)内存泄漏 模仿块级作用域 私有变量 (1)...

  • javaScript门道之闭包

    闭包的学习路径:变量的作用域 -> 闭包的概念 ->闭包的应用 1.变量的作用域 变量的作用域分为作用于全局和作用...

  • 14.JS基础之作用域与闭包

    作用域: 全局作用域 函数作用域 块级作用域(ES6新增) 常见的闭包有:作为函数返回值的闭包与作为函数参数的闭包...

  • JavaScript学习笔记(四)——函数表达式

    匿名函数 作用:模仿块级作用域 递归 严格模式下使用命名函数 闭包 闭包是指有权访问另一个函数作用域中的变量的函数...

网友评论

      本文标题:递归 闭包 作用域

      本文链接:https://www.haomeiwen.com/subject/wpwdoltx.html