1、下面的代碼輸出多少?修改代碼讓 fnArr[i]() 輸出 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 ++) {
!function(j){
fnArr[j] = function(){
return j;
};
}(i);
};
console.log(fnArr[3]()); //輸出3月培。
方法二:
var fnArr = [];
for (var i = 0; i < 10; i ++) {
fnArr[i] = function(j){
return function(){
return j;
};
}(i);
};
console.log(fnArr[3]()); //輸出3。
方法三:
var fnArr = [];
var output = function(j){
fnArr[j] = function(){
return j;
};
};
for (var i = 0; i < 10; i ++) {
output(i);
};
console.log(fnArr[3]()); //輸出3恩急。
方法四:
var fnArr = [];
for (let i = 0; i < 10; i ++) {
fnArr[i] = function(){
return i;
};
};
console.log( fnArr[3]() ); //輸出3杉畜。
2、 封裝一個(gè)汽車對(duì)象衷恭,可以通過如下方式獲取汽車狀態(tài)此叠。
var Car = (function(){
var speed = 0;
function setSpeed(s){
speed = s;
};
function getSpeed(){
return speed;
};
function accelerate(){
speed += 10;
};
function decelerate(){
if(speed > 10){
speed -= 10;
}else{
speed = 0;
};
};
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);
}, 0);
var a ;
console.log(a);
a = 3;
console.log(a); //輸出1,3,2。因?yàn)閟etTimeout中的函數(shù)會(huì)在其它語(yǔ)句執(zhí)行完之后再執(zhí)行窗看。
4简卧、下面這段代碼輸出結(jié)果是?為什么烤芦?
var flag = true;
setTimeout(function(){
flag = false;
},0);
while(flag){};
console.log(flag); //不輸出举娩。因?yàn)?flag = true ,所以 while(flag){}; 會(huì)讓程序陷入一個(gè)沒有任何輸出的死循環(huán)。
5铜涉、下面這段代碼輸出智玻?如何輸出delayer: 0, delayer:1...(使用閉包來(lái)實(shí)現(xiàn))。
for(var i=0;i<5;i++){
setTimeout(function(){
console.log('delayer:' + i );
}, 0);
console.log(i);
}; //輸出0,1,2,3,4,delayer:5,delayer:5,delayer:5,delayer:5,delayer:5芙代。
方法一:
for(var i=0;i<5;i++){
!function(j){
setTimeout(function(){
console.log('delayer:' + j );
}, 0);
}(i);
}; //輸出delayer:0,delayer:1,delayer:2,delayer:3,delayer:4吊奢。
方法二:
for(var i=0;i<5;i++){
setTimeout(function(j){
return function(){
console.log('delayer:' + j );
};
}(i), 0);
}; //輸出delayer:0,delayer:1,delayer:2,delayer:3,delayer:4。
方法三:
var output = function(j){
setTimeout(function(){
console.log('delayer:' + j );
}, 0);
};
for(var i=0;i<5;i++){
output(i);
};
方法四:
for(let i=0;i<5;i++){
setTimeout(function(){
console.log('delayer:' + i );
}, 0);
}; //輸出delayer:0,delayer:1,delayer:2,delayer:3,delayer:4纹烹。
6涮帘、如何獲取元素的真實(shí)寬高泊愧?
我們可以通過getComputedStyle來(lái)獲取元素的真實(shí)寬高娱俺。它是一個(gè)可以獲取當(dāng)前元素所有最終使用的CSS樣式的屬性值派撕,返回的是一個(gè)CSS樣式聲明對(duì)象([object CSSStyleDeclaration])。
例如:
var div = document.querySelector('div');
console.log(window.getComputedStyle(div).width);
console.log(window.getComputedStyle(div).height);
另外片挂,在較低版本的IE瀏覽器下幻林,我們需要使用currentStyle來(lái)進(jìn)行這個(gè)操作。
7音念、URL 如何編碼解碼沪饺?為什么要編碼?
-
編碼:
encodeURI()闷愤,對(duì)統(tǒng)一資源標(biāo)識(shí)符(URI)進(jìn)行編碼的方法整葡。它使用1到4個(gè)轉(zhuǎn)義序列來(lái)表示每個(gè)字符的UTF-8編碼。
encodeURIComponent()讥脐,對(duì)統(tǒng)一資源標(biāo)識(shí)符(URI)的組成部分進(jìn)行編碼的方法遭居。它使用一到四個(gè)轉(zhuǎn)義序列來(lái)表示字符串中的每個(gè)字符的UTF-8編碼。其中攘烛,encodeURI方法不會(huì)對(duì)下列字符編碼:
1.ASCII字母
2.數(shù)字
3.~!@#$&*()=:/,;?+'而encodeURIComponent方法不會(huì)對(duì)下列字符編碼:
1.ASCII字母
2.數(shù)字
3.~!*()'所以encodeURIComponent比encodeURI編碼的范圍更大。
前者被設(shè)計(jì)用來(lái)對(duì)一個(gè)URL中的值進(jìn)行轉(zhuǎn)義镀首,會(huì)把這些功能字符也進(jìn)行轉(zhuǎn)義坟漱;而后者被設(shè)計(jì)來(lái)用于對(duì)完整URL進(jìn)行URL Encode,于是URL中的功能字符更哄,比如&, ?, /, =等等這些并不會(huì)被轉(zhuǎn)義芋齿。 解碼:
decodeURI(),可對(duì) encodeURI() 函數(shù)編碼的 URI 進(jìn)行解碼成翩。
decodeURIComponent()觅捆,可對(duì) encodeURIComponent() 函數(shù)編碼的 URI 進(jìn)行解碼。由于URL的編碼格式采用的是ASCII碼而不是Unicode麻敌,因此URL中不能包含任何非ASCII字符(例如中文)栅炒,否則在客戶端和服務(wù)端瀏覽器支持的字符集不同的情況下,就可能出現(xiàn)問題。這也就意味著赢赊,如果URL中有漢字或其它非規(guī)定字符乙漓,就必須編碼后使用。
另外释移,HTTP協(xié)議中通過URL傳參是通過鍵值對(duì)形式進(jìn)行的叭披,格式上是以?玩讳、&和=為特征標(biāo)識(shí)進(jìn)行解析涩蜘,如果鍵或者值的內(nèi)容中包含這些符號(hào),就會(huì)造成解析錯(cuò)誤熏纯,所以要進(jìn)行編碼同诫,用不會(huì)造成歧義的符號(hào)代替有歧義的符號(hào)。
8豆巨、補(bǔ)全如下函數(shù)剩辟,判斷用戶的瀏覽器類型。
function isAndroid(){
return /Android/i.test(navigator.userAgent);
};
funcnction isIphone(){
return /iPhone/i.test(navigator.userAgent);
};
function isIpad(){
return /iPad/i.test(navigator.userAgent);
};
function isIOS(){
return /(iPad)|(iPhone)/i.test(navigator.userAgent);
};