首页 > 其他分享 >作用域和闭包常见的面试题

作用域和闭包常见的面试题

时间:2022-11-28 10:12:26浏览次数:57  
标签:闭包 function 面试题 console 作用域 var scope data

作用域和闭包常见的面试题

作用域

  1. 变量提升
var scope="global";
function scopeTest(){
    console.log(scope);
    var scope="local"  
}
scopeTest(); //undefined

上面的代码输出是undefined,这是因为局部变量scope变量提升了,等效于下面

var scope="global";
function scopeTest(){
    var scope;
    console.log(scope);
    scope="local"  
}
scopeTest(); //undefined

如果在局部作用域中忘记var,那么变量就被声明为全局变量。
2. 没有块级作用域

var data = [];

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

data[0]();	// 3
data[1]();	// 3
data[2]();	// 3

如果要强制返回预期的结果,怎么办???

  1. 立即执行函数
for (var i = 0; i < 3; i++) {
    (function(num) {
        setTimeout(function() {
            console.log(num);
        }, 1000);
    })(i);
}
// 0
// 1
// 2
  1. 返回一个匿名函数赋值
var data = [];

for (var i = 0; i < 3; i++) {
  data[i] = (function (num) {
      return function(){
          console.log(num);
      }
  })(i);
}

data[0]();	// 0
data[1]();	// 1
data[2]();	// 2
  1. 使用ES6中的let
var data = [];

for (let i = 0; i < 3; i++) {
  data[i] = function () {
    console.log(i);
  };
}

data[0]();
data[1]();
data[2]();

作用域链

每个函数都有自己的执行上下文环境,当代码在这个环境中执行时,会创建变量对象的作用域链,作用域链是一个对象列表或对象链,它保证了变量对象的有序访问。

作用域链的开始是当前代码执行环境的变量对象,常被称之为“活跃对象”(AO),变量的查找会从第一个链的对象开始,如果对象中包含变量属性,那么就停止查找,如果没有就会继续向上级作用域链查找,直到找到全局对象中

闭包

function createClosure(){
    var name = "jack";
    return {
        setStr:function(){
            name = "rose";
        },
        getStr:function(){
            return name + ":hello";
        }
    }
}
var builder = new createClosure();
builder.setStr();
console.log(builder.getStr()); //rose:hello

上面在函数中返回了两个闭包,这两个闭包都维持着对外部作用域的引用。闭包中会将外部函数的自由对象添加到自己的作用域链中,所以可以通过内部函数访问外部函数的属性,这也是javascript模拟私有变量的一种方式。

下面是我的小程序体验码,希望能和大家共同学习进步

标签:闭包,function,面试题,console,作用域,var,scope,data
From: https://www.cnblogs.com/eyesstar/p/16931457.html

相关文章

  • C语言支持闭包
    前言c语言不支持闭包函数,因此需要通过参数结构体保存所有参数,将上下文传递给业务概述下面是一个例子,用于重试#include<stdio.h>#include<unistd.h>typedefenum{......
  • 面试题收集
    秋招过后,根据学习群里很多小伙伴的反馈,发现在Java后端面试中,Redis是所有框架/中间件中被问到频率最高的。但是由于本身不熟悉Redis,再加上大厂的面试题也确实是很难,有些还......
  • SpringBoot面试题
    1SpringBoot启动Tomcat1.1Spring在启动时创建一个Spring容器1.2利用@ConditionalOnClass技术判断classpath中是否存丰Tomcat依赖,如果存在则生成一个启动Tomcat的Bean1.......
  • Rust闭包
    很多语言中都有闭包的概念,闭包就是一个能够捕获周围作用域中变量的函数,它们通常以简洁的形式展现,比如lambda表达式。Rust的Lambda表达式Rust中的闭包也是lambda表达式形......
  • 面试题系列:MQ 夺命连环11问
      1.你们为什么使用mq?具体的使用场景是什么? mq的作用很简单,削峰填谷。以电商交易下单的场景来说,正向交易的过程可能涉及到创建订单、扣减库存、扣减活动预算、扣......
  • Linux面试题3:Linux零拷贝技术
    zero-copy技术Linux网络IO数据传输过程图整个操作过程中,做了四次用户态和内核态的状态切换,数据从网卡copy到内核缓冲区,再从内核缓冲区copy到user-space;写入时从user-spa......
  • 宝宝精刷题笔记 面试题 02.05. 链表求和
    题目描述给定两个用链表表示的整数,每个节点包含一个数位。这些数位是反向存放的,也就是个位排在链表首部。编写函数对这两个整数求和,并用链表形式返回结果。示例1:输入......
  • 【面试题】 面试官为啥总是喜欢问前端路由实现方式?
    背景从事前端开发的同学,在实际工作中,一定会接触过路由这个概念,同时在面试的过程中,经常会被问及关于前端路由的实现方式,面试官到底想考察什么?在现在SPA单页面模式盛行,前后端......
  • 变量,常量,作用域
    变量、常量、作用域变量变量就是剋以变化的量在内存中的一块位置Java是一种强类型语言,每个变量都必须声明其类型Java变量是程序中最基本的存储单元,其要素包括变量名,......
  • spring::ioc作用域
    Bean的作用域singleton单实例prototype多实例,每次都是新建一个prototype,<!--Beans.xml文件--><?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="http://www......