闭包:https://zhuanlan.zhihu.com/p/2248690816异步:https://zhuanlan.zhihu.com/p/2268596011
题目1: 下面的代码输出多少?修改代码让fnArri 输出 i。使用两种以上的方法
//代码要分解来看啊哈
for(var i = 0;i<10;i++){
fnArr[i] = function(){
return i
}
//这一步,没有执行函数,只是把函数保存在数组里了
console.log(fnArr3)
//这一步才是执行函数。此时的i已经变为10 了,后面的闭包作用就是在函数保存在数组中时把那时的i索引值保存到临时变量里了
var fnArr = [];
for (var i = 0; i < 10; i ++) {
(function(n){
var i = n
fnArr[i] = function(){
return i;
};
})(i)
}
var fnArr = [];
for (var i = 0; i < 10; i ++) {
(function(){
var n = i
fnArr[i] = function(){
return n;
};
})()
}
var fnArr = [];
for (var i = 0; i < 10; i ++) {
fnArr[i] = (function(){
var n = i;
return function(){
return n;}
})();
};
console.log( fnArr3 );
2.封装一个汽车对象,可以通过如下方式获取汽车状态.
var Car = (function(){
var speed = 0;
function setSpeed(s){
speed = s
}
function getSpeed(){
return speed
}
function accelerate(){
speed+=10
}
function decelerate(){
speed-=10
}
function decelerate(){
speed-=10
}
function getStatus(ele){
running=ele
}
function getStatus(ele){
if(speed>0){
return speed = 'runing'
}else{
return speed = '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';
题目3: 下面这段代码输出结果是? 为什么?
var a = 1;
setTimeout(function(){
a = 2;
console.log(a);
}, 0);
var a ;
console.log(a);//1延时被放当前执行函数的后面了
a = 3;
console.log(a);//3 a被重新赋值为3了
题目4: 下面这段代码输出结果是? 为什么?
var flag = true;
setTimeout(function(){
flag = false;
},0)
while(flag){}
console.log(flag);
代码陷入死循环 后面console永远无法输出,因为延时函数会被放当前执行函数的后面执行,所以这里flag的值一直是true所以会一直在执行while遍历
题目5: 下面这段代码输出?如何输出delayer: 0, delayer:1...
(使用闭包来实现)
for(var i=0;i<5;i++){
(function(i){
i = i;
setTimeout(function(){
console.log('delayer:' + i );
}, 0);
})(i)
console.log(i);
}
6: 如何获取元素的真实宽高
function trueStyle(ele,pseduoElement)
{
//IE不支持window.getComputedStyle(),支持element.currentStyle();
return ele.currentStyle?ele.currentStyle:window.getComputedStyle(ele,pseduoElement)
}
var trueHeight = trueStyle(ele).height;
var trueWidth = trueHeight(ele).windth;
7: URL 如何编码解码?为什么要编码?
var myURL = 'https://www.google.com/#q=javascript';
//如果我们想编码一个URL并且可以使用它(访问),使用encodeURI();
var simpleURL = encodeURI(myURL); //"https://www.google.com/#q=javascript"
//如果我们想编码一个URL并且可以将其放置在某URL的参数中,使用encodeURIComponent();因为encodeComponent()//编码范围更大 / 和?都会编
var completeURL = encodeURIComponent(myURL);
var newURL = 'https://www.google.com/?back=' + completeURL; //"https://www.google.com/?back=https%3A%2F%2Fwww.google.com%2F%23q%3Djavascript"
window.open(simpleURL); //将会打开一个窗口,地址为https://www.google.com/#q=javascript