闭包、定时器、BOM
1.下面的代码输出多少?修改代码让fnArr[i]()
输出 i。使用两种以上的方法
var fnArr = []; // 1. for(var i = 0; i < 10; i++){ (function(n){ fnArr[i] = function(){ return n; } })(i); } // 2. for(var i = 0; i < 10; i++){ fnArr[i] = (function(n){ return function(){ return n; } })(i); } console.log(fnArr[3]());
2.封装一个汽车对象,可以通过如下方式获取汽车状态
var Car = (function(){ var speed = 0; function setSpeed(s){ speed = s } function getSpeed(){ console.log(speed); } function accelerate(){ speed += 10; } function decelerate(){ speed -= 10; } function getStatus(){ if(speed > 0) { console.log('running'); }else{ speed = 'error'; console.log('stop'); } } return { setSpeed: setSpeed, getSpeed: getSpeed, accelerate: accelerate, decelerate: decelerate, getStatus: getStatus, } })() Car.setSpeed(30); Car.getSpeed(); //30 Car.accelerate(); Car.getSpeed(); //40; Car.decelerate(); Car.decelerate(); Car.getSpeed(); //20 Car.getStatus(); // 'running'; Car.decelerate(); Car.decelerate(); Car.getStatus(); //'stop'; Car.speed; //error
3.下面这段代码输出结果是? 为什么?
var a = 1; setTimeout(function(){ a = 2; console.log(a); }, 0); var a ; console.log(a); a = 3; console.log(a);
结果是1,3,2
经过变量提升,第一个输出的为1,第二个输出为3
setTimeout(code|function,millisec)会放在执行代码队列的最后面,最后输出为2
4.下面这段代码输出结果是? 为什么?
var flag = true; setTimeout(function(){ flag = false; },0) while(flag){} console.log(flag);
结果是一直不停循环直到浏览器崩溃
while(flag=true) {}
会一直运行,而setTimeout(code|function,millisec)
会放在执行代码队列的最后面,所以flag一直都是true
5.下面这段代码输出?如何输出delayer: 0, delayer:1...
(使用闭包来实现)
for(var i=0;i<5;i++){ setTimeout(function(n){ return function(){ console.log('delayer:' + n ); } }(i), 0); console.log(i); }
6.如何获取元素的真实宽高
<head> <meta charset="utf-8"> <style type="text/css"> .box { width: 200px; height: 200px; background-color: pink; margin: 100px auto; } </style></head> <body> <div class="box"></div> <script type="text/javascript"> var box = document.querySelector('.box'); console.log(getComputedStyle(box,null)['margin']); </script> </body>
7.URL 如何编码解码?为什么要编码?
JavaScript提供四个URL的编码/解码方法。
decodeURI() //解码
decodeURIComponent() //解码
encodeURI() //编码
encodeURIComponent() //编码
区别
encodeURI方法不会对下列字符编码
ASCII字母
数字
~!@#$&*()=:/,;?+'
encodeURIComponent方法不会对下列字符编码
ASCII字母
数字
~!*()'
所以encodeURIComponent比encodeURI编码的范围更大。
当我们需要编码一个URL并且要使用的时候,使用encodeURI来编码。当需要编码URL中的参数时,用encodeURIComponent,因为后面的/是需要编码的。
<button class="btn">点我</button><script type="text/javascript"> var btn = document.querySelector('.btn'); btn.addEventListener('click',function(){ var param = "http://www.cnblogs.com/season-huang/"; param = encodeURI(param); var url = "http://www.cnblogs.com?next=" + param; console.log(url); window.open(url) })</script>
8.补全如下函数,判断用户的浏览器类型
function isAndroid(){ return /android/i.test(navigator.userAgent); } function isIphone(){ return /iphone/i.test(navigator.userAgent); } function isIpad(){ return /ipad/i.test(navigator.userAgent); } function isIOS(){ return /(ipad)|(iphone)/i.test(navigator.userAgent); }
闭包概念
1.作为一个函数变量的一个引用,当函数返回时,其处于激活状态。
2.一个闭包就是当一个函数返回时,一个没有释放资源的栈区。
简单的说,javascript允许使用内部函数---即函数定义和函数表达式位于另一个函数的函数体内。而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量、参数和声明的其他内部函数。当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包。
官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。
闭包的特点:
function closure(){ var str = "I'm a part variable."; return function(){ alert(str); } } var fObj = closure(); fObj();
在上面代码中,str是定义在函数closure中局部变量,若str在closure函数调用完成以后不能再被访问,则在函数执行完成后str将被释放。但是由于函数closure返回了一个内部函数,且这个返回的函数引用了str变量,导致了str可能会在closure函数执行完成以后还会被引用,所以str所占用的资源不会被回收。这样closure就形成了一个闭包。
作者:饥人谷_米弥轮
链接:https://www.jianshu.com/p/4aead07dd0af
共同学习,写下你的评论
评论加载中...
作者其他优质文章