闭包

这些面试题你会怎么答? (系列一)

大城市里の小女人 提交于 2020-02-01 02:44:47
这些面试题你会怎么答? (系列一) Vue中文社区 8月16日 前言 最近参加了几场面试,积累了一些高频面试题,我把面试题分为两类,一种是基础试题: 主要考察前端技基础是否扎实,是否能够将前端知识体系串联。一种是开放式问题: 考察业务积累,是否有自己的思考,思考问题的方式,这类问题没有标准答案。 基础题 题目的答案提供了一个思考的方向,答案不一定正确全面,有错误的地方欢迎大家请在评论中指出,共同进步。 怎么去设计一个组件封装 组件封装的目的是为了重用,提高开发效率和代码质量 低耦合,单一职责,可复用性,可维护性 前端组件化设计思路 js 异步加载的方式 渲染引擎遇到 script 标签会停下来,等到执行完脚本,继续向下渲染 defer 是“渲染完再执行”,async 是“下载完就执行”,defer 如果有多个脚本,会按照在页面中出现的顺序加载,多个async 脚本不能保证加载顺序 加载 es6模块的时候设置 type=module,异步加载不会造成阻塞浏览器,页面渲染完再执行,可以同时加上async属性,异步执行脚本(利用顶层的this等于undefined这个语法点,可以侦测当前代码是否在 ES6 模块之中) css 动画和 js 动画的差异 代码复杂度,js 动画代码相对复杂一些 动画运行时,对动画的控制程度上,js 能够让动画,暂停,取消,终止,css动画不能添加事件

这些面试题你会怎么答?

对着背影说爱祢 提交于 2020-02-01 02:42:21
前言 最近参加了几场面试,积累了一些高频面试题,我把面试题分为两类,一种是基础试题: 主要考察前端技基础是否扎实,是否能够将前端知识体系串联。一种是开放式问题: 考察业务积累,是否有自己的思考,思考问题的方式,这类问题没有标准答案。 基础题 题目的答案提供了一个思考的方向,答案不一定正确全面,有错误的地方欢迎大家请在评论中指出,共同进步。 怎么去设计一个组件封装 组件封装的目的是为了重用,提高开发效率和代码质量 低耦合,单一职责,可复用性,可维护性 前端组件化设计思路 js 异步加载的方式 渲染引擎遇到 script 标签会停下来,等到执行完脚本,继续向下渲染 defer 是“渲染完再执行”,async 是“下载完就执行”,defer 如果有多个脚本,会按照在页面中出现的顺序加载,多个async 脚本不能保证加载顺序 加载 es6模块的时候设置 type=module,异步加载不会造成阻塞浏览器,页面渲染完再执行,可以同时加上async属性,异步执行脚本(利用顶层的this等于undefined这个语法点,可以侦测当前代码是否在 ES6 模块之中) css 动画和 js 动画的差异 代码复杂度,js 动画代码相对复杂一些 动画运行时,对动画的控制程度上,js 能够让动画,暂停,取消,终止,css动画不能添加事件 动画性能看,js 动画多了一个js 解析的过程,性能不如 css

如何输出1-5题详解

安稳与你 提交于 2020-02-01 02:00:35
如何输出1-5 for (var i = 1; i <= 5; i++) { setTimeout(function timer() { console.log(i) }, i * 1000) } // 6 6 6 6 6 分析 i的作用域链: timer scope -> global scope i变量会循着以上的作用域链来查找,当然此时是在global作用域链找到了i ,但是setTimeout是异步的,会在1s、2s、3s、4s、5s时运行,这个时候都去找全局的i,此时循环早就完成了,i变为6,所以输出5个6,解决问题的关键有两种思路 解决问题的关键 为每次循环的函数保存此次循环的变量状态 1. 利用实参 PS: 参数列表 在ES6时,已经被明确定义为一个作用域 在timer scope函数体内查找i变量后, 在向上查找之前,会查找函数实参列表中的变量,我们将i传入,并在调用函数时使用这个i,每个函数实例能够保存自己的实参状态,就能解决i的共享问题 for (var i = 1; i <= 5; i++) { setTimeout( function timer(j) { console.log(j) }, i * 1000, i ) } // 1 2 3 4 5 2. 产生作用域来保存状态 我们知道,前面的问题是状态最终都指向了global上的i,作用域可以保存变量的状态

【javascript】Javascript闭包

限于喜欢 提交于 2020-02-01 01:58:33
  在描述闭包的实现与用途前,需要了解以下一些知识点。   执行上下文(执行上下文环境)   1 console.log(a); //Uncaught ReferenceError: a is not defined 2 3 console.log(b); //undefined 4 var b; 5 6 console.log(c); //undefined 7 var c = 10;   看上面一个例子,当直接在控制台输出a时,提示a未定义,这个很容易就理解了。不过在"var b"和"var c = 10"执行前输出b和c的值时,得到的结果却是undefined。因为代码是一条一条执行的,在执行console.log()之前,"var b"和"var c = 10"必定是还未执行的。而结果却与a的输出结果不同,这是怎么一回事?  第二种情况: 1 console.log( this ); 输出: 第三种情况: 1 console.log(f1);   2 function f1(){};  //函数声明 3 4 console.log(f2); 5 var f2 = function (){};  //函数表达式 输出:    从这里可以看出来,在一段js代码拿过来真正一句一句运行之前,浏览器做了一些“准备工作”,其中就包括对变量的声明,而不是赋值

闭包

女生的网名这么多〃 提交于 2020-01-31 10:55:43
变量声明提升: 通过var定义的变量,在定义之前就可以访问到,不过值为undefined 函数声明提升: 函数在未声明以前就可以提前调用。 全局执行上下文。 var定义的全局变量=undefined,添加为window属性 function声明的全局函数= 赋值fun。添加为window的方法 this=赋值(window) 函数执行上下文 在调用函数时,执行函数体之前,创建对应的函数执行上下文对象(虚拟的,存在于栈中) 对局部的数据进行预处理 形参---》添加实参属性,添加为上下文的属性 argument ---》赋值(实参列表),添加为执行上下文的属性。 作用域与作用域链 函数n+1个作用域 闭包: <script type="text/javascript"> var btns = document.getElementsByTagName("button"); /* for(var i = 0,length=btns.length;i<length;i++){ var btn = btns[i] btn.index = i btn.onclick = function(){ alert("第"+(this.index+1)+"个"); } }*/ for(var i = 0,length=btns.length;i<length;i++ ){ (function(i){/

写一个闭包

二次信任 提交于 2020-01-31 08:56:48
什么是闭包(closure),为什么要用它? 闭包指的是一个函数可以访问另一个函数作用域中变量。常见的构造方法,是在一个函数内部定义另外一个函数。内部函数可以引用外层的变量;外层变量不会被垃圾回收机制回收。 注意,闭包的原理是作用域链,所以闭包访问的上级作用域中的变量是个对象,其值为其运算结束后的最后一个值。 优点:避免全局变量污染。缺点:容易造成内存泄漏。 function makeFunc ( ) { var name = "Mozilla"; function displayName ( ) { console.log(name); } return displayName; } var myFunc = makeFunc(); myFunc(); 来源: https://www.cnblogs.com/zazahao/p/10877589.html

let解决闭包

╄→尐↘猪︶ㄣ 提交于 2020-01-30 13:24:09
先看一个经典闭包问题: <ul> <li>1</li> <li>2</li> <li>3</li> <li>4</li> </ul> window.onload = function () { var lis = document.getElementsByTagName('li'); for (var i = 0; i < lis.length; i++) { lis[i].onclick = function (){ alert(i) } } } // 点击结果都为4 为使输出内容为0,1,2,3.通常我们会使用立即执行函数来解决,如: window.onload = function () { var lis = document.getElementsByTagName('li'); for (var i = 0; i < lis.length; i++) { lis[i].onclick = (function (){ var index=i; return function(){ alert(index) } }()) } } // 点击结果为0,1,2,3 但是,使用let就可以轻松解决次问题 (将for循环里的var改为let) window.onload = function () { var lis = document.getElementsByTagName

C++11中的function和bind

可紊 提交于 2020-01-29 05:28:59
文章目录 闭包的概念 lambda和函数指针 function bind 使用bind来替代bind1st和bind2nd 使用组合bind函数 参考资料   C++11中引入lambda,与operator() 和 函数(函数指针)统称为可调用对象。而operator()和lambda也实现了闭包。 闭包的概念   闭包是带有上下文的函数,这个函数带有状态,也就是重载了()的类。什么叫 “带有状态” 呢? 意思是这个闭包有属于自己的变量,这些个变量的值是创建闭包的时候设置的,并在调用闭包的时候,可以访问这些变量。   函数是代码,状态是一组变量,将代码和一组变量捆绑,就形成了闭包,内部包含 static 变量的函数不是闭包,因为这个 static 变量不能捆绑。 闭包的状态捆绑,必须发生在运行时。 lambda和函数指针   lambda虽然也叫匿名函数,但是其可以捕捉变量 ,所以和普通函数还是不一样的。 using Func = int ( int ) ; int test ( int x ) { cout << x << endl ; return 0 ; } auto lamb = [ ] ( int x ) - > int { cout << x << endl ; return 0 ; } ; void fun ( Func f , int x ) { f ( x )

python全栈开发从入门到放弃之函数进阶

ⅰ亾dé卋堺 提交于 2020-01-28 09:32:01
1、三元运算 1 a= 1 2 b=2 3 max = (a if a>b else b ) #条件成立的结果 if 条件 else 条件不成立的结果 4 print(max) 2、先上一首python之禅 1 import this 2 3 Beautiful is better than ugly. 4 Explicit is better than implicit. 5 Simple is better than complex. 6 Complex is better than complicated. 7 Flat is better than nested. 8 Sparse is better than dense. 9 Readability counts. 10 Special cases aren't special enough to break the rules. 11 Although practicality beats purity. 12 Errors should never pass silently. 13 Unless explicitly silenced. 14 In the face of ambiguity, refuse the temptation to guess. 15 There should be one-- and

浅谈Swift的属性(Property)

守給你的承諾、 提交于 2020-01-28 05:31:06
原文博客地址: 浅谈Swift的属性(Property) 今年期待已久的 Swift5.0 稳定版就已经发布了, 感兴趣的小伙伴可看我的这篇博客: Swift 5.0新特性更新 这篇博客可主要分享 Swift 的属性的相关介绍和剖析, 测试环境: Xcode 11.2.1 , Swift 5.1.2 属性分类 在 Swift 中, 严格意义上来讲属性可以分为两大类: 实例属性和类型属性 实例属性( Instance Property ): 只能通过实例去访问的属性 存储实例属性( Stored Instance Property ): 存储在市里的内存中, 每个实例都只有一份 计算实例属性( Computed Instance Property ) 类型属性( Type Property ): 只能通过类型去访问的属性 存储类型属性( Stored Type Property ): 整个程序运行过程中就只有一份内存(类似全局变量) 计算类型属性( Computed Type Property ) 类型属性可以通过 static 关键字定义; 如果是类也可以通过 class 关键字定义 实例属性属于一个特定类型的实例,每创建一个实例,实例都拥有属于自己的一套属性值,实例之间的属性相互独立 为类型本身定义属性,无论创建了多少个该类型的实例,这些属性全局都只有唯一一份