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 为冒泡阶段。
参与互动