知识

闭包

能够访问另一个函数作用域的变量的函数

闭包的实质:就是因为函数嵌套还形成的作用域链

闭包的定义:函数A内有一个函数B,函数B可以访问到函数A的变量,那么函数B就是闭包

闭包的优点:避免全局变量的污染;能够实现封装和缓存

闭包的缺点:消耗内存(由于会携带包含它的函数和变量),使用不当会造成内存溢出

闭包的特性:

  1. 函数内嵌套函数;
  2. 内层函数可以应用外层函数的参数和变量;
  3. 参数和变量不会被垃圾回收机制回收(解决:在退出函数之前将不使用的变量删除)。

闭包的坑点:1、引用的变量可能发生变化

前:function outer() {                 
            var result = []           
            for (var i = 0; i < 10; i++) {                
                 result[i] = function () {                   
                     console.info(i)               
                 }            
            }           
            return result        
        }//由于每个闭包函数访问的变量i都是outer执行环境下的,随着for结束,i为10

后:function outer() {
            var result = [] for (var i = 0; i<10;i++){
            result[i] = (function (num) {
                return function() {
                    console.info(num); // 此时的num,是上层函数执行环境的num,数组有10个函数,每个对象的执行环境下的number都不一样
                }
            })(i)}
            return result
        }

2、this指向

var object = {
     name: "object",
     getName: function() {
        return function() {
             console.info(this.name)
        }
    }
}
object.getName()()    // underfined
// 因为里面的闭包函数是在window作用域下执行的,也就是说,this指向windows

3、内存泄露问题

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

// 改成下面
function  showId() {
    var el = document.getElementById("app")
    var id  = el.id
    el.onclick = function(){
      aler(id) 
    }
    el = null    // 主动释放el
}

作用域链

就是为了保证执行环境里有权访问的变量和函数是有序的,作用域链的变量只能向上访问,变量访问到window对象即被终止,作用域链向下访问变量是不被允许的

简单的说,作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期

内存泄露

  1. setTimeout 的第一个参数使用字符串而非函数的话,会引发内存泄漏
  2. 闭包使用不当

你可能感兴趣的:(前端,javascript,vue.js,html5)