js 闭包(面试题)

JavaScript09

js 闭包(面试题),第1张

1. 闭包的本质就是在一个函数内部创建另一个函数。

2

匿名函数作为fun的返回值被赋值给了f,

这时候相当于 f=function(){var n = 0 … },

并且匿名函数内部引用着fun里的变量num,所以变量num无法被销毁,

而变量n是每次被调用时新创建的,所以每次 f 执行完后它就把属于自己的变量连同自己一起销毁,

于是乎最后就剩下孤零零的num,于是这里就产生了内存消耗的问题

3. 定时器与闭包

最后总结一下闭包的好处与坏处

好处

①保护函数内的变量安全 ,实现封装,防止变量流入其他环境发生命名冲突

②在内存中维持一个变量,可以做缓存(但使用多了同时也是一项缺点,消耗内存)

③匿名自执行函数可以减少内存消耗

坏处

①其中一点上面已经有体现了,就是被引用的私有变量不能被销毁,增大了内存消耗,造成内存泄漏,解决方法是可以在使用完变量后手动为它赋值为null;

②其次由于闭包涉及跨域访问,所以会

主要问题在于,自执行函数没有形参i,如果加一个形参i,输出的就是0-4了。如这样

for(var i =0i<5i++){

(function(i){

setTimeout(function(){

console.log(i)

},i*1000)

})(i)

}

这就是作用域的问题,for循环每执行一遍,都会生成一个异步函数setTimeout,由于这个时候是同步的,自执行函数里边的i,读取的就是每次for循环的i,所以每次执行相差1秒。然后js是单线程的,setTimeout需要等for执行完之后执行。这时候,for循环执行完使得i的值变为5,而自执行函数没有形参,setTimeout回调函数读的变量是自执行函数外的变量i,所以输出为5。也就是每隔一秒输出一个5。

你可以试着把5变成更大的数,也是一样的,输出的就是这个数。

61.作用域的分类

参考答案:块作用域、词法作用域、动态作用域

解析:

1 块作用域 花括号 {}

2 词法作用域(js 属于词法作用域) 作用域只跟在何处被创建有关系,跟在何处被调用没有关系

3 动态作用域 作用域只跟在何处被调用有关系,跟在何处被创建没有关系

参与互动

62.js 属于哪种作用域

参考答案:词法作用域(函数作用域)

解析:

参与互动

63.浮点数精度

参考答案:参考

参与互动

64.自执行函数? 用于什么场景?好处?

参考答案:

好处:防止变量弥散到全局,以免各种 js 库冲突。隔离作用域避免污染,或者截断作用域链,避免闭包造成引用变量无法释放。利用立即执行特性,返回需要的业务函数或对象,避免每次通过条件判断来处理

场景:一般用于框架、插件等场景

参与互动

65.多个页面之间如何进行通信

参考答案:有如下几个方式:

参与互动

66.css 动画和 js 动画的差异

参考答案:

1.代码复杂度,js 动画代码相对复杂一些 2.动画运行时,对动画的控制程度上,js 能够让动画,暂停,取消,终止,css 动画不能添加事件 3.动画性能看,js 动画多了一个 js 解析的过程,性能不如 css 动画好

解析:参考

参与互动

67.如何做到修改 url 参数页面不刷新

参考答案:

HTML5 引入了 history.pushState() 和 history.replaceState() 方法,它们分别可以添加和修改 历史 记录条目。

假设当前页面为 foo.html ,执行上述代码后会变为 bar.html ,点击浏览器后退,会变为 foo.html ,但浏览器并不会刷新。 pushState() 需要三个参数: 一个状态对象, 一个标题 (目前被忽略), 和 (可选的) 一个 URL.让我们来解释下这三个参数详细内容:

参与互动

68.数组方法 pop() push() unshift() shift()

参考答案:

参与互动

69.事件绑定与普通事件有什么区别

参考答案:

参与互动

70.IE 和 DOM 事件流的区别

参考答案:

1.事件流的区别

IE 采用冒泡型事件 Netscape 使用捕获型事件 DOM 使用先捕获后冒泡型事件 示例:

复制代码代码如下:

冒泡型事件模型: button->p->body (IE 事件流)

捕获型事件模型: body->p->button (Netscape 事件流)

DOM 事件模型: body->p->button->button->p->body (先捕获后冒泡)

2.事件侦听函数的区别

IE 使用:

DOM 使用:

bCapture 参数用于设置事件绑定的阶段,true 为捕获阶段,false 为冒泡阶段。

参与互动