闭包

前端面试实习题目总结:

只谈情不闲聊 提交于 2019-12-05 18:00:20
以下是部分整理,有时间还会整理出其他的~~ (最近还在找实习呜呜~~) 1.JavaScript是一种弱类型语言,有什么优点和缺点 https://blog.csdn.net/sinolze... (1)强类型定义语言:强制数据类型定义的语言。也就是说,一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型了。举个例子:如果你定义了一个整型变量a,那么程序根本不可能将a当作字符串类型处理。强类型定义语言是类型安全的语言。 (2)弱类型定义语言:数据类型可以被忽略的语言。它与强类型定义语言相反, 一个变量可以赋不同数据类型的值。 强类型定义语言在速度上可能略逊色于弱类型定义语言,但是强类型定义语言带来的严谨性能够有效的避免许多错误。另外,“这门语言是不是动态语言”与“这门语言是否类型安全”之间是完全没有联系的! 例如:Python是动态语言,是强类型定义语言(类型安全的语言); VBScript是动态语言,是弱类型定义语言(类型不安全的语言);JAVA是静态语言,是强类型定义语言(类型安全的语言)。 2.js的数据类型: https://www.cnblogs.com/wu-we... .类型定义 JS是一种弱类型语言。JS拥有动态类型,相同的变量可以用作不同的类型。 JS有7种数据类型:三种基本类型(数字,字符串,布尔),两种引用数据类型(对象,数组)

匿名函数和闭包的区别

。_饼干妹妹 提交于 2019-12-05 17:50:52
在学习python基础中对于匿名函数和闭包等只是有不太明白的地方,分不清他们的区别,所以整理下方便后期复习提升。反思:对于零碎的python基础知识,一定要牢记,多看多敲代码,一回生二回熟,熟能生巧。 一、匿名函数 所谓匿名就是不需要函数表达式 lambda x : x*x 关键字lambda表示匿名函数,冒号前面的x表示函数参数。 匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果。 小结: 匿名函数:lambda表达式:通过一个表达式实现函数功能 基本语法:lambda 参数列表:表达式语句 参数列表:用来给表达式传递数据 表达式语句:计算表达式,计算结果会自动输出 注意事项:lambda表达式,主要是用来替代功能简单的函数的!提高代码的简洁性 不要滥用!大量使用lambda表达式会造成代码可读性的严重下降! 二、闭包 1、定义:内部函数包含对外部作用域而非全剧作用域名字的引用,该内部函数称为闭包函数。 2、创建闭包函数:    如果在一个 内部函数里对外部作用域 (但不是全局作用域)的变量 进行引用 ,内部函数称为闭包(closure) ------闭包函数必须有内嵌函数 ------内嵌函数需要引用该嵌套函数上一级namespace中的变量 ------闭包函数必须返回内嵌函数 小结: 闭包就是函数里面嵌套一个函数 因为函数的出现

闭包

梦想与她 提交于 2019-12-05 17:33:39
一、闭包 1.变量作用域 变量根据作用域的不同分为两种:全局变量和局部变量。 1.函数内部可以使用全局变量。 2.函数外部不可以使用局部变量。 3.当函数执行完毕,本作用域内的局部变量会销毁。 二、 什么是闭包 闭包 :指有权访问另一个函数作用域中变量的 函数 。------JavaScript高级程序设计 简单理解就是:一个作用域可以访问另外一个函数内部的局部变量。 闭包的作用:延伸了变量的作用范围 function fn(){ var num=10; return function fun(){ console.log(num); } } var f=fn(); //类似于var f=function(){ console.log(num); } f(); 三、闭包的应用 <ul class="nav"> <li>榴莲</li> <li>臭豆腐</li> <li>鱼罐头</li> <li>大猪蹄子</li> </ul> <script> //闭包应用-点击li输出当前li的索引号 //1.我们可以利用动态添加属性的方式 var lis=document.querySelector('.nav').querySelectorAll('li'); // for(var i=0;i<lis.length;i++){ // lis[i].index=i; // lis[i]

对js闭包的理解

谁说我不能喝 提交于 2019-12-05 15:42:42
  个人理解 闭包:函数内部定义一个函数,内部函数可以访问外包函数定义的变量。   闭包的特点:变量长驻内存   demo实现一个类似函数调用计数器功能: function fn(){ var c = 0; function inner(){ c += 1; console.log(c) } return inner; } var f1 = fn(); f1(); // 1 f1(); // 2 c没有被释放,长驻内存 使用场景1:给setTimeout引用的函数传递参数(setTimeout的第一个参数只能是函数的引用) function laterCall(a){ return function(){ console.log("a:",a) } } var fn2 = laterCall(123); setTimeout(fn2,1000)   使用场景2:模拟私有成员 var module1 = (function(){ var a = 1; var addOne = function(){ a += 1; return a }; var subOne = function(){ a -= 1; return a }; return{ addOne:addOne, subOne:subOne } })(); module1.addOne() module1.subOne()

37个JavaScript基本面试问题和解答

折月煮酒 提交于 2019-12-05 15:28:26
1、使用typeof bar ===“object”来确定bar是否是一个对象时有什么潜在的缺陷?这个陷阱如何避免? 尽管typeof bar ===“object”是检查bar是否是对象的可靠方法,但JavaScript中令人惊讶的问题是_null_也被认为是一个对象! 因此,下面的代码打印到控制台的是true而不是false: var bar = null; console.log(typeof bar === "object"); // logs true! 只要知道这一点,就可以通过检查bar是否为空来轻松避免该问题: console.log((bar !== null) && (typeof bar === "object")); // logs false 为了在我们的答案更加的完整,还有两件事值得注意: 首先,如果bar是一个函数,上面的解决方案将返回false。在大多数情况下,这是所期望的行为,但是在您希望函数返回true的情况下,您可以将上述解决方案修改为: console.log((bar !== null) && ((typeof bar === "object") || (typeof bar === "function"))); 其次,如果bar是数组,则上述解决方案将返回true(例如,如果var bar = [];)。在大多数情况下,这是所希望的行为

10个JavaScript难点

半世苍凉 提交于 2019-12-05 14:04:32
1. 立即执行函数 立即执行函数 ,即Immediately Invoked Function Expression (IIFE),正如它的名字,就是创建函数的同时立即执行。它没有绑定任何事件,也无需等待任何异步操作: ( function ( ) { // 代码 // ... } ) ( ) ; function(){…} 是一个匿名函数,包围它的一对括号将其转换为一个表达式,紧跟其后的一对括号调用了这个函数。 立即执行函数 也可以理解为立即调用一个匿名函数。 立即执行函数 最常见的应用场景就是:将var变量的作用域限制于你们函数内,这样可以避免命名冲突 2. 闭包 对于闭包(closure),当外部函数返回之后,内部函数依然可以访问外部函数的变量。 function f1 ( ) { var N = 0 ; // N是f1函数的局部变量 function f2 ( ) // f2是f1函数的内部函数,是闭包 { N + = 1 ; // 内部函数f2中使用了外部函数f1中的变量N console . log ( N ) ; } return f2 ; } var result = f1 ( ) ; result ( ) ; // 输出1 result ( ) ; // 输出2 result ( ) ; // 输出3 代码中,外部函数 f1 只执行了一次,变量 N 设为 0

JS三座大山再学习(二、作用域和闭包)

…衆ロ難τιáo~ 提交于 2019-12-05 13:39:16
原文地址 作用域 JS中有两种作用域:全局作用域|局部作用域 栗子1 console.log(name); //undefined var name = '波妞'; var like = '宗介' console.log(name); //波妞 function fun(){ console.log(name); //波妞 console.log(eat) //ReferenceError: eat is not defined (function(){ console.log(like) //宗介 var eat = '肉' })() } fun(); name定义在全局,在全局可以访问到,所以 (2) 打印能够正确打印; 在函数fun中,如果没有定义name属性,那么会到它的父作用域去找,所以 (3) 也能正确打印。 内部环境可以通过作用域链访问所有外部环境,但外部环境不能访问内部环境的任何变量和函数。类似 单向透明 ,这就是作用域链,所以 (4) 不行而 (5) 可以。 那么问题来了,为什么第一个打印是"undefined",而不是"ReferenceError: name is not defined"。原理简单的说就是JS的 变量提升 变量提升: JS在解析代码时,会将所有的声明提前到所在作用域的最前面 栗子2 console.log(name); //undefined

js闭包理解与使用场景

穿精又带淫゛_ 提交于 2019-12-05 11:04:50
要理解闭包首先要知道什么是函数的作用域链 因为有函数的作用域链存在,所以函数无论在哪里调用,函数都可以使用函数外部作用域的变量。 当一个函数被调用时,会创建一个执行环境及相应的作用域链。然后使用arguments和其他命名参数的值来初始化函数的活动对象。此活动对象在当前函数作用域链的第一位,外部函数的活动对象在作用域链的第二位,外部函数的外部函数的活动对象在第三位,直至作为作用域链终点的全局执行环境。 闭包的作用: 实现一个作用域,达到封装的目的,这样做的好处是隐藏私有变量,防止污染全局变量; 还可以实现缓存功能 1 案例1:隐藏私有变量 2 3 function pack() { 4 5 var index; 6 7 return function () { 8 9 return index++; 10 11 }; 12 13 } 14 15 16 17 var p = pack(); 18 19 p(); 20 21 22 23 案例2:缓存 24 25 function createFab(n) { 26 var _cache = {}; 27 return function (n) { 28 var result = 0; 29 if (_cache[n]) { 30 return _cache[n]; 31 } 32 if (n === 1 || n === 2) {

一篇文章看懂JS闭包,都要2020年了,你怎么能还不懂闭包?

北战南征 提交于 2019-12-05 10:03:59
壹 ❀ 引 我觉得每一位JavaScript工作者都无法避免与闭包打交道,就算在实际开发中不使用但面试中被问及也是常态了。就我而言对于闭包的理解仅止步于一些概念,看到相关代码我知道这是个闭包,但闭包能解决哪些问题场景我了解的并不多,这也是我想整理一篇闭包的原因。我们来看一段代码,很明显这是一个闭包,那么请问闭包指代的是下方代码中的哪一部分呢?本文开始。 function outer() { let name = '听风是风'; function insider() { console.log(`欢迎来到${name}的博客`); }; return insider; }; outer()(); //欢迎来到听风是风的博客 贰 ❀ 什么是闭包? 如果在面试中被问及什么是闭包,大部分情况下得到的答复是(至少我以前是) A函数嵌套B函数,B函数使用了A函数的内部变量,且A函数返回B函数,这就是闭包 。 这段描述当然没问题,那么为了让下次面试回答的更为漂亮,就让我们从更专业的角度重新认识闭包。 1.闭包起源 闭包翻译自英文单词 closure ([ˈkloʊʒər] 倒闭,关闭,停业) ,闭包的概念最早出现在1964 年的学术期刊 《The Computer Journal》 上,由 P. J. Landin 在 《 The mechanical evaluation of

JavaScript之作用域和闭包

▼魔方 西西 提交于 2019-12-05 09:59:27
一、作用域 作用域共有两种主要的工作模型:第一种是最为普遍的,被大多数编程语言所采用的词法作用域,另外一种叫作动态作用域; JavaScript所采用的作用域模式是词法作用域。 1.词法作用域 词法作用域意味着作用域是由书写代码时函数声明的位置来决定的。编译的词法分析阶段基本能够知道全部标识符在哪里以及是如何声明的,从而能够预测在执行过程中如何对它们进行查找。 JavaScript 中有两个机制可以“欺骗”词法作用域: eval(..):可以对一段包含一个或多个声明的“代码”字符串进行演算,并借此来修改已经存在的词法作用域(在运行时) ; with:通过将一个对象的引用当作作用域来处理,将对象的属性当作作用域中的标识符来处理,从而创建了一个新的词法作用域(同样是在运行时) 。 这两个机制的副作用是引擎无法在编译时对作用域查找进行优化,因为引擎只能谨慎地认为这样的优化是无效的。使用这其中任何一个机制都将导致代码运行变慢。 2.函数作用域和块级作用域 函数作用域: 函数是 JavaScript 中最常见的作用域单元。本质上,声明在一个函数内部的变量或函数会在所处的作用域中“隐藏”起来,即函数内定于的函数和变量为该函数私有; 块级作用域: 块作用域指的是变量和函数不仅可以属于所处的作用域,也可以属于某个代码块(通常指 { .. } 内部)