1.下面的代碼輸出多少错负?修改代碼讓 fnArri 輸出 i坟瓢。使用 兩種以上的方法
var fnArr = [];
for (var i = 0; i < 10; i ++) {
fnArr[i] = function(){
return i;
};
}
console.log( fnArr[3]() ); //
方法一
//IIFE 閉包
var fnArr = [];
for (var i = 0; i < 10; i ++) {
fnArr[i] = function(num){
return function(){
return num
};
}(i);
}
console.log( fnArr[3]() );
方法二:
//ES6的let來申明i
var fnArr = [];
for (let i = 0; i < 10; i ++) {
fnArr[i] = function(){
return i;
};
}
console.log( fnArr[3]() );
方法三:
var fnArr = [];
for (let i = 0; i < 10; i ++) {
!function(i){
fnArr[i] = function(){
return i;
};
}(i);
}
console.log( fnArr[3]() );
2.封裝一個汽車對象,可以通過如下方式獲取汽車狀態(tài)
var Car = (function(){
var speed = 0;
function setSpeed(s){
speed = s;
}
function getSpeed(){
console.log(speed);
}
function accelerate(){
speed += 10;
}
function decelerate(){
if((speed - 10) <=0){
speed = 0;
}else{
speed -= 10;
}
}
function getStatus(){
if(speed >0){
console.log('running');
}else{
console.log('stop');
}
}
return {
setSpeed: setSpeed,
getSpeed: getSpeed,
accelerate: accelerate,
decelerate: decelerate,
getStatus: getStatus,
speed:'error'
};
})();
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);//2
}, 0);
var a ;
console.log(a);//1
a = 3;
console.log(a);//3
輸出的結(jié)果為
1犹撒,3折联,2
。因為瀏覽器在執(zhí)行上述代碼的時候识颊,執(zhí)行的setTimeout
的時候诚镰,會啟動一個計時器,設(shè)定一個代碼指定的時間祥款,上述代碼設(shè)置了0秒清笨,然后瀏覽器就會繼續(xù)執(zhí)行接下去的代碼,即使期間計時器的時間已經(jīng)到了刃跛。等到代碼執(zhí)行完畢抠艾,接著會執(zhí)行setTimeout里需要執(zhí)行的函數(shù)。
4.下面這段代碼輸出結(jié)果是? 為什么?
var flag = true;
setTimeout(function(){
flag = false;
},0)
while(flag){}
console.log(flag);//true
console.log
輸出的結(jié)果為true
桨昙,因為setTimeout
及時設(shè)置的時間已經(jīng)到了检号,也會等到后續(xù)的代碼執(zhí)行完畢才開始運行需要執(zhí)行的函數(shù),但是上述代碼中的while
循環(huán)的條件為flag
然而flag
的值為true
蛙酪,導(dǎo)致while
會一直在運行齐苛。所以setTimeout
里的函數(shù)所執(zhí)行的flag =false
永遠(yuǎn)不會執(zhí)行。
5.下面這段代碼輸出滤否?如何輸出delayer: 0, delayer:1...(使用閉包來實現(xiàn))
for(var i=0;i<5;i++){
setTimeout(function(){
console.log('delayer:' + i );
}, 0);
console.log(i);
}
for(var i=0;i<5;i++){
!function(i){
setTimeout(function(){
console.log('delayer:' + i );
}, 0);
}(i);
console.log(i);
}
6.如何獲取元素的真實寬高
用offsetHeight
和offsetWidth
var intElemOffsetHeight = document.getElementById(id_attribute_value).offsetHeight;
var intElemOffsetWidth = document.getElementById(id_attribute_value).offsetWidth;
7.URL 如何編碼解碼脸狸?為什么要編碼?
var uri = "https://w3schools.com/my test.asp?name=st?le&car=saab";
var uri_enc = encodeURIComponent(uri); //編碼
var uri_dec = decodeURIComponent(uri_enc); //解碼
var res = uri_enc + "<br>" + uri_dec;
結(jié)果
// Encoded URI
https%3A%2F%2Fw3schools.com%2Fmy%20test.asp%3Fname%3Dst%C3%A5le%26car%3Dsaab
// Decoded URI
https://w3schools.com/my test.asp?name=st?le&car=saab
為什么要編碼
因為網(wǎng)絡(luò)標(biāo)準(zhǔn)RFC 1738做了硬性規(guī)定:
"...Only alphanumerics [0-9a-zA-Z], the special characters "$-.+!*'()," [not including the quotes - ed], and reserved characters used for their reserved purposes may be used unencoded within a URL."
"只有字母和數(shù)字[0-9a-zA-Z]藐俺、一些特殊符號"$-.+!*'(),"[不包括雙引號]炊甲、以及某些保留字,才可以不經(jīng)過編碼直接用于URL欲芹。"
8.補全如下函數(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|iPod/i.test(navigator.userAgent);
}