美文网首页语言基础
函数闭包-js-v1.0.0

函数闭包-js-v1.0.0

作者: 一点金光 | 来源:发表于2019-07-30 08:52 被阅读0次
---
title:函数闭包
date: 2018-06-09 16:29:00
updated: 2018-06-10 12:00:00
categories:
- 语言基础
- 函数编程
tags:
- nodejs
---

#什么是它?

一个函数。在它的内部访问外部的变量,在它的外部访问它的变量。

#解决问题?

解决--引用的变量可能发生变化的问题

//发现问题:
function before() {
    let result = [];
    for(let i = 0;i<10; i++){
      result[i] = function () {
          console.info(i)
      }
   }
   return result
}
//解决问题:
function after() {
    let result = [];
    for(let i = 0;i<10; i++){
      result[i]= function (num) {//{1}
           return function() {//{2}
                 // {2}访问函数外部的变量num
                 console.info(num);   
           }
      }(i)
   }
   return result
}

解决--内存泄漏问题

//发现问题:
function  before() {
    var el = document.getElementById("app")
    el.onclick = function(){
      aler(el.id)   // 这样会导致闭包引用外层的el,当执行完showId后,el无法释放
    }
}

//解决问题:
function  after() {
    var el = document.getElementById("app")
    //{1}
    var id  = el.id
    el.onclick = function(){
      aler(id)   //{2}
    }
    el = null    // {3}主动释放el
}

解决--改上下文问题

//发现问题:
var object = {
    name:"object",
    getName:function() {
        let that = this //{1}
       return function() {
            console.info(that.name)//{2}
       }
   }
}
object.getName()()    // underfined

//解决问题:
var object = {
    name:"object",
    getName:function() {
        let that = this //{1}
       return function() {
            console.info(that.name)//{2}
       }
   }
}

object.getName()()    // object

解决--递归调用问题

//发现问题:
function beforeFactorial(num) {
    if(num<= 1) {
        return 1;
    } else {
       return num * beforeFactorial(num-1)
    }
 }
 let anotherFactorial = beforeFactorial
 beforeFactorial = null
 anotherFactorial(4)   // 报错 ,因为最好是return num* arguments.callee(num-1),arguments.callee指向当前执行函数,但是在严格模式下不能使用该属性也会报错,所以借助闭包来实现
 
//解决问题:
let  newFactorial = (function f(num){
    if(num<1) {return 1}
    else {
       return num* f(num-1)
    }
})

解决--变量提升问题

//发现问题:
//es6没出来之前,用var定义变量存在变量提升问题
for(var i=0; i<10; i++){
    console.info(i)
}
alert(i)  // 变量提升,弹出10
 
//解决问题:
(function () {
    for(var i=0; i<10; i++){
         console.info(i)
    }
})()
alert(i)   // underfined 

相关文章

  • 函数闭包-js-v1.0.0

    #什么是它? 一个函数。在它的内部访问外部的变量,在它的外部访问它的变量。 #解决问题? 解决--引用的变量可能发...

  • 如何理解闭包?

    1、定义: 嵌套在函数作用域中的函数,称为闭包函数。该作用域称为闭包环境。通过闭包函数可以访问闭包函数所在函数作用...

  • 关于逃逸闭包

    逃逸闭包:当函数执行结束后,才去调用函数内部的闭包,叫做逃逸闭包非逃逸闭包当函数执行过程中,执行的函数内部的闭包,...

  • 3.逃逸闭包,非逃逸闭包

    逃逸闭包:当函数执行结束后,才去调用函数内部的闭包,叫做逃逸闭包非逃逸闭包:当函数执行过程中,执行的函数内部的闭包...

  • (9) python之闭包

    闭包闭包 = 函数 + 环境变量(函数定义的时候) 一个最简单的闭包 闭包不受外部变量影响 非闭包 闭包 闭包 只...

  • day14-函数(3)装饰器

    一、闭包函数 闭包函数=函数嵌套定义+函数对象+名称空间与作用域 闭包函数 1、闭:指的是该函数是定义在一个函数内...

  • 面试题(day-2)

    1 ,什么是闭包?闭包有什么好处?使用闭包要注意什么? 闭包:函数嵌套函数,内部函数可以引用外部函数的参数和变量,...

  • JS的闭包

    1.闭包的概念 闭包函数:声明在一个函数中的函数,叫做闭包函数。闭包:内部函数总是可以访问其所在的外部函数中声明的...

  • python函数之闭包

    目录 python函数之闭包什么是闭包python中的namespace闭包的条件闭包的优点 python函数之闭...

  • 2018-07-10swift4与swift 3.3 语法重拾(

    函数与闭包 闭包

网友评论

    本文标题:函数闭包-js-v1.0.0

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