1. 下面的代碼輸出多少?修改代碼讓 fnArri 輸出 i。使用 兩種以上的方法
var fnArr = [];
for (var i = 0; i < 10; i ++) {
fnArr[i] = function(){
return i;
};
}
console.log( fnArr3 ); //
- 方法一
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è)汽車(chē)對(duì)象,可以通過(guò)如下方式獲取汽車(chē)狀態(tài)
var Car = (function(){
var speed = 0;
function setSpeed(s){
speed = s
}
...
return {
setSpeed: setSpeed,
...
}
})()
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
- 解析的過(guò)程為:
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.也會(huì)在整個(gè)代碼執(zhí)行完成之后再執(zhí)行
4.下面這段代碼輸出結(jié)果是? 為什么?
var flag = true;
setTimeout(function(){
flag = false;
},0)
while(flag){}
console.log(flag);
//沒(méi)有任何輸出
//setTimeout會(huì)在整個(gè)代碼執(zhí)行完畢之后再執(zhí)行,
但是由于flag始終為true,
while函數(shù)會(huì)一直執(zhí)行下去,
所以setTimeout不會(huì)執(zhí)行
5.下面這段代碼輸出?如何輸出delayer: 0, delayer:1…(使用閉包來(lái)實(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ù)為偽類(lèi),沒(méi)有則不設(shè)置
getComputedStyle(test,pse).height //獲取元素的寬度,第二鴿參數(shù)為偽類(lèi),沒(méi)有則不設(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 如何編碼解碼?為什么要編碼?
編碼方式:
encodeURI()
encodeURIComponent()區(qū)別:
encodeURI方法不會(huì)對(duì)下列字符編碼ASCII字母、數(shù)字、~!@#$&*()=:/,;?+'
encodeURIComponent方法不會(huì)對(duì)下列字符編碼ASCII字母、數(shù)字、~!*()'
所以encodeURIComponent比encodeURI編碼的范圍更大。解碼方式:
decodeURI()
decodeURIComponent()編碼原因:
對(duì)于Url來(lái)說(shuō),之所以要進(jìn)行編碼,是因?yàn)閁rl中有些字符會(huì)引起歧義。
比如說(shuō)“name1=value1”,其中value1的值是“va&lu=e1”字符串,那么實(shí)際在傳輸過(guò)程中就會(huì)變成這樣“name1=va&lu=e1”。我們的本意是就只有一個(gè)鍵值對(duì),但是服務(wù)端會(huì)解析成兩個(gè)鍵值對(duì),這樣就產(chǎn)生了歧義。
又如,Url的編碼格式采用的是ASCII碼,而不是Unicode,這也就是說(shuō)你不能在Url中包含任何非ASCII字符,例如中文。否則如果客戶端瀏覽器和服務(wù)端瀏覽器支持的字符集不同的情況下,中文可能會(huì)造成問(wèn)題。
URL編碼的原則就是使用安全的字符(沒(méi)有特殊用途或者特殊意義的可打印字符)去表示那些不安全的字符.
預(yù)備知識(shí):URI是統(tǒng)一資源標(biāo)識(shí)的意思,通常我們所說(shuō)的URL只是URI的一種。下面提到的URL編碼,實(shí)際上應(yīng)該指的是URI編碼。
8.補(bǔ)全如下函數(shù),判斷用戶的瀏覽器類(lèi)型
function isAndroid(){
}
function isIphone(){
}
function isIpad(){
}
function isIOS(){
}
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)
}