1.下面的代碼輸出多少?修改代碼讓 fnArri 輸出 i。使用 兩種以上的方法
var fnArr=[]
for(var i =0;i<10;i++){
fnArr[i]=function(){
return i
}
}
console.log(fnArr[3]())
//輸出10
改寫 方法一:
var fnArr=[]
for(var i=0;i<10;i++){
fnArr[i]=(function(j){
return function(){
return j
}
})(i)
}
console.log(fnArr[4]()) //4
方法二
var fnArr=[]
for (var i=0;i<10;i++){
!function(i){
fnArr[i]=function(){
return i
}
}(i)
}
console.log(fnArr[5]())//5
2. 封裝一個(gè)汽車對象,可以通過如下方式獲取汽車狀態(tài)
var Car = (function(){
var speed = 0;
function setSpeed(s){
speed = s
return speed
}
function getSpeed(){
return speed
}
function decelerate(){
speed-=10
return speed
}
function accelerate(){
speed+=10
return speed
}
function getStatus(){
if (speed>0){
return 'running'
}
else{
return '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.下面這段代碼輸出結(jié)果是? 為什么?
var a = 1;
setTimeout(function(){
a = 2;
console.log(a);//第三個(gè)
}, 0);
var a ;
console.log(a);//第一個(gè)
a = 3;
console.log(a);//第二個(gè)
// 1,3,2
//即使setTimeout時(shí)間間隔為0.也會在整個(gè)代碼執(zhí)行完成之后再執(zhí)行
4.下面這段代碼輸出結(jié)果是? 為什么?
var flag = true;
setTimeout(function(){
flag = false;
},0)
while(flag){}
console.log(flag);
//沒有任何輸出
//setTimeout會在整個(gè)代碼執(zhí)行完畢之后再執(zhí)行,但是由于flag始終為true,while函數(shù)會一直執(zhí)行下去,所以setTimeout不會執(zhí)行
5.下面這段代碼輸出?如何輸出delayer: 0, delayer:1…(使用閉包來實(shí)現(xiàn))
for(var i=0;i<5;i++){
!function(i){
setTimeout(function(){
console.log('delayer:' + i );
}, 0);
console.log(i);
}(i)}
6. 如何獲取元素的真實(shí)寬高
var teat= document.querySelector(".test")
getComputedStyle(test,pse).width //獲取元素的寬度,第二鴿參數(shù)為偽類,沒有則不設(shè)置
getComputedStyle(test,pse).height //獲取元素的寬度,第二鴿參數(shù)為偽類,沒有則不設(shè)置
//兼容低版本IE的方式
function tureStyle(element,pse){
return element.currentStyle ?
element.currentStyle:window.getComputedStyle(element,pse);
}
var trueWidth=tureStyle(element,pse).width
var trueHeight=tureStyle(element,pse).height
7.URL 如何編碼解碼?為什么要編碼?
URL的編碼/解碼方法
1.decodeURI()
2.decodeURIComponent()
3.encodeURI()
4.encodeURIComponent()-
區(qū)別
- encodeURI方法不會對下列字符編碼
- ASCII字母
- 數(shù)字
- ~!@#$&*()=:/,;?+’
- encodeURIComponent方法不會對下列字符編碼
- ASCII字母
- 數(shù)字
-
~!*()'
所以encodeURIComponent比encodeURI編碼的范圍更大。
實(shí)際例子來說,encodeURIComponent會把 http:// 編碼成 http%3A%2F%2F 而encodeURI卻不會。
image
- encodeURI方法不會對下列字符編碼
-
為什么要編碼
- HTTP協(xié)議中參數(shù)組件的傳輸是“key=value”鍵值對的形式,如果要傳輸多個(gè)參數(shù)就需要用“&”符號對鍵值對進(jìn)行分隔。例如?name1=value1&name2=$value2,這樣在服務(wù)器收到這種字符串的時(shí)候,會用“&”分隔出每一個(gè)參數(shù),然后再用“=”來分隔出參數(shù)值。如果我的參數(shù)值中就包含=或者&這樣的特殊子字符的時(shí)候,比如說“name1=value1”,其中value1的值是“va&lu=e1”,那么在傳輸過程中就會變成“name1=va&lu=e1”。用戶傳輸?shù)谋疽馐侵挥幸粋€(gè)鍵值對,但是服務(wù)器端會解析成兩個(gè)鍵值對,這樣就自然的產(chǎn)生了歧義。這時(shí)就需要對上述產(chǎn)生歧義的字符進(jìn)行編碼。參考1
8.補(bǔ)全如下函數(shù),判斷用戶的瀏覽器類型
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 /(Iphone)|(Ipad)/i.test(navigator.userAgent);
}
