函数、函数表达式、做用域、闭包

函数声明和函数表达式

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]();

以上代码执行结果为:3spa

解析:

  • 第一种方法中,只有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才能访问私有变量

闭包的缺陷

闭包中的变量由于可能还会被内部函数用到,所以所占内存一直不能被释放,致使内存浪费code

相关文章
相关标签/搜索