函数声明和函数表达式

var f = function () {
    
}

function f() {
    
}

函数声明和函数表达式的主要区别是,函数声明会被前置,而函数表达式作为变量,会被提升。

下方是js执行时的逻辑

// 前置和变量提升
var f;
function f() {
    
}

f = function () {
    
}

一道题考察知识掌握情况

var f = function () {
    console.log(1)
}

function f() {
    console.log(2)
}

f();

上方代码直接结果为:1

Function函数了解一下,不怎么常用

图片描述

闭包(不说话,看图就可以)

图片描述

一道题考察闭包(循环闭包)
var o = [];
for(var i = 0; i < 5; i++){
    o[i] = function () {
        console.log(i)
    }
}

o[3]();

以上代码执行结果为:5

如何改进以上代码,使o[1]=>1; o[2]=>2; ..., 那就是利用闭包咯

var o = [];
for(var i = 0; i < 5; i++){
    (function (i) {
        o[i] = function () {
            console.log(i);
        }
    })(i);
}

o[3]();

以上代码执行结果为:3

解析:

  • 第一种方法中,只有o[3]()执行时,才会用i,而i却一直在变化,等到o[3]()执行时,i已经是5了;
  • 第二种方法,运用了闭包,因为o[i]函数的上一层是自执行函数,因此所运用到的闭包参数i,在for循环过程中就已经固定,不再变化。等到o[3]执行时,固定的闭包参数就被释放了出来
  • 被面试的时候被问到这道题,问我除了闭包有没有其它方法,没答出来,原来将var改成let就可以了,竟然不知道
var o = [];
for(let i = 0; i < 5; i++){
    o[i] = function () {
        console.log(i)
    }
}

闭包第二种应用场景(封装变量)

(function () {
  var name = 'LHX';
  var age = 30;
  var export = {};
  
  export.getName = function () {
      return name;
  }
  export.setName = function (newName) {
      name = newName;
  }
  
  window.export = export;
})();

只有通过释放出来的export才能访问私有变量

闭包的缺陷

闭包中的变量因为可能还会被内部函数用到,因此所占内存一直不能被释放,导致内存浪费


lihaixing
463 声望719 粉丝

前端就爱瞎折腾


引用和评论

0 条评论