美文网首页我爱编程
JS基础面试题——作用域及闭包

JS基础面试题——作用域及闭包

作者: 石燕平_Leo | 来源:发表于2018-05-05 21:57 被阅读0次

这次主要用例子解释一下什么是作用域,什么是自由变量,什么是闭包,因为用一句话概括实在是概括不出来,欢迎有大神可以一句话解释的在评论区评论一下,十分感谢。

1. 说一下变量提升的理解

以下两种情况下会进行变量提示

  1. 变量定义
  2. 函数申明(要区分函数表达式和函数申明)

2. 说明this几种不同的使用场景

  1. 在构造函数中使用
  2. 作为对象属性时使用
  3. 作为普通函数时使用
  4. call,apply,bind
var a = {
  name: 'A',
  fun: function() {
    console.log(this.name);
  }
};

a.fun();  //this === a
a.fun.call({ name: 'B' });  //this === { name: 'B' }
var fun1 = a.fun;
fun1(); //this === window

3. 创建10个a标签,点击每个弹出对应的序号

  • 错误的例子:
// 在点击a标签时每个输出的都是10
var i, a;
for (i = 0; i < 10; i++) {
  a = document.createElement('a');
  a.innerHTML = i + '<br>';
  a.addEventListener('click', function(e) {
    e.preventDefault();
    alert(i); //自由变量,会从父元素找i,点击时,其实i已经执行完变成了10
  });
  document.body.appendChild(a);
}
  • 使用闭包改进的例子:

当然,在ES6中可以使用let

var i;
for (i = 0; i < 10; i++) {
  (function(i) {
    // 函数作用域
    var a = document.createElement('a');
    a.innerHTML = i + '<br>';
    a.addEventListener('click', function(e) {
      e.preventDefault();
      alert(i);
    });
    document.body.appendChild(a);
  })(i);
}

4. 如何理解作用域

  1. 自由变量
  2. 作用域链,及自由变量的查找,找不到逐级向上找
  3. 闭包的两个场景:
    3.1 函数作为变量传递
    3.2. 函数作为返回值

5. 实际开发中闭包的应用

// 判断一个数字是否出现过
function isFirst() {
  var _list = [];
  return function(id) {
    if (_list.indexOf(id) >= 0) {
      return false;
    } else {
      _list.push(id);
      return true;
    }
  };
}

var first = isFirst();
first(10);
first(10);
first(20);

相关文章

  • 闭包(closure)

    ● 闭包基础 ● 闭包作用 ● 闭包经典例子 ● 闭包应用 ● 闭包缺点 ● 参考资料 1、闭包基础 作用域和作...

  • JS基础知识:变量对象、作用域链和闭包

    JS基础知识:变量对象、作用域链和闭包 前言:这段时间一直在消化作用域链和闭包的相关知识。之前看《JS高程》和一些...

  • js闭包问题

    javascript 闭包的概念,闭包的作用,闭包经典面试题详解(配图解) 函数作用域(闭包前置知识) 要彻底弄懂...

  • javascript面试准备(一)

    interview js 基础 原型 原型链 作用域 闭包 异步 单线程 js Api dom 操作 ajax 事...

  • JS基础面试题——作用域及闭包

    这次主要用例子解释一下什么是作用域,什么是自由变量,什么是闭包,因为用一句话概括实在是概括不出来,欢迎有大神可以一...

  • 闭包

    一、理解闭包前js基础1、作用域链(作用域、作用域链中有说)。2、js的内存回收机制。一个函数在执行开始的时候,会...

  • JavaScript 作用域链及闭包

    作用域链及闭包

  • js闭包的理解

    什么是闭包 通俗的来讲,个人觉得闭包就是延长变量作用域的函数。众所周知js的作用域分为全局作用域和链式作用域。在函...

  • Javascript 闭包

    如果要了解闭包,我们需要先了解闭包的由来,闭包的产生,源于JS的词法作用域 词法作用域 作用域是指一个 变量能够访...

  • js 闭包

    一、js 作用域 讲闭包首先就要理解 js 的作用域。再 ES5 中,js 有两种作用域,全局作用域和函数作用域(...

网友评论

    本文标题:JS基础面试题——作用域及闭包

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