題目1: 下面的代碼輸出多少?修改代碼讓 fnArr[i]() 輸出 i。使用 兩種以上的方法
var fnArr = [];
for (var i = 0; i < 10; i ++) {
fnArr[i] = function(){
return i;
};
}
console.log( fnArr[3]() ); //10
//將每一次循環(huán)的i都傳給j
var fnArr = [];
for (var i = 0; i < 10; i ++) {
!function(j){
fnArr[j] = function(){
return j;
};
}(i)
}
console.log( fnArr[3]() ); //
//let不可以重復(fù)聲明變量
var fnArr = [];
for (var i = 0; i < 10; i ++) {
let temp = i; // var temp=i ==>9
fnArr[i] = function(){
return temp;
};
}
console.log( fnArr[3]() ); //
function sss(p1,p2){
}
//相當(dāng)于
function sss(){
var p1=arguments[0]
var p2=arguments[1]
}
//∴
var a=100 //1號a
!function(a){ // 形參
a=1;
console.log('asdf'+a) //asdf1
}(a)
console.log(a) //100
VM275:3 asdf1
VM275:5 100
!function(a){
console.log(a) //99
}(99)
!function(a){ //2號a(形參)
console.log(a) //2號a
}(a) //傳入1號a(arguments[0])
題目2: 封裝一個汽車對象峡继,可以通過如下方式獲取汽車狀態(tài)
var Car = (function(){
var speed = 0;
function setSpeed(s){
speed = s
}
function getSpeed(){
return speed;
}
function accelerate(){
return speed += 10
}
function decelerate(){
if (speed>0){
return speed -=10
}else{
return speed = 0
}
}
function getStatus(){
if (speed>0){
return 'running'
}else{
return 'stop'
}
}
return {
a: setSpeed,
getSpeed: getSpeed,
accelerate: accelerate,
decelerate: decelerate,
getStatus: getStatus,
speed: speed,
}
})()
console.log(Car.a(30));
console.log(Car.getSpeed()); //30
console.log(Car.accelerate());
console.log(Car.getSpeed()); //40;
console.log(Car.decelerate());
console.log(Car.decelerate());
console.log(Car.getSpeed()); //20
console.log(Car.getStatus()); // 'running';
console.log(Car.decelerate());
console.log(Car.decelerate());
console.log(Car.getStatus());
console.log(Car.speed); //0
題目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
// 輸出 1 3 2岸梨,
js是單線程,當(dāng)線程中沒有執(zhí)行任何同步代碼的前提下才會執(zhí)行異步代碼篷扩,setTimeout是異步代碼兄猩,所以setTimeout只能等js空閑才會執(zhí)行
題目4:下面這段代碼輸出結(jié)果是? 為什么?
var flag = true;
setTimeout(function(){
flag = false;
},0)
while(flag){}
console.log(flag);
// 無輸出,因?yàn)閒lag=true鉴未,while無法退出枢冤,無法執(zhí)行接下來的代碼,更無法執(zhí)行異步任務(wù)
題目5: 下面這段代碼輸出铜秆?如何輸出delayer: 0, delayer:1...(使用閉包來實(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
undefined
5VM187:3 delayer:5
----------------------------------------------------
for(var i=0;i<5;i++){
!function (i){
setTimeout(function(){
console.log('delayer:' + i );
}, 0);
}(i)
console.log(i);
}
//
0
VM211:7 1
VM211:7 2
VM211:7 3
VM211:7 4
undefined
VM211:4 delayer:0
VM211:4 delayer:1
VM211:4 delayer:2
VM211:4 delayer:3
VM211:4 delayer:4
題目6: 如何獲取元素的真實(shí)寬高
window.getComputedStyle
style屬性內(nèi)的值非常機(jī)械淹真,讀取的就是元素的內(nèi)聯(lián)style屬性的值,而不是我們計算出來的實(shí)際值连茧,所以一般情況下沒什么用處
getComputedStyle是一個可以獲取當(dāng)前元素所有最終使用的CSS屬性值核蘸。返回的是一個CSS樣式聲明對象([object CSSStyleDeclaration])
(一看這個函數(shù)的名字我們就知道問題解決了)
低版本IE要用element.currentStyle()
function getStyle(e) {
return e.getComputedStyle() ? window.getComputedStyle(e) : e.currentStyle }
let trueWidth = getStyle(e).width;
let trueHeight = getStyle(e).height;
題目7: URL 如何編碼解碼?為什么要編碼啸驯?
JavaScript提供四個URL的編碼/解碼方法客扎。
decodeURI()
decodeURIComponent()
encodeURI()
encodeURIComponent()
區(qū)別
- encodeURI方法不會對下列字符編碼
- ASCII字母
- 數(shù)字
- ~!@#$&*()=:/,;?+'
- encodeURIComponent方法不會對下列字符編碼
- ASCII字母
- 數(shù)字
- ~!*()'
所以encodeURIComponent比encodeURI編碼的范圍更大。
實(shí)際例子來說罚斗,encodeURIComponent會把http://
編碼成http%3A%2F%2F
而encodeURI卻不會徙鱼。
如果你需要編碼整個URL,然后需要使用這個URL针姿,那么用encodeURI袱吆。 encodeURI("http://www.cnblogs.com/season-huang/some other thing");
//"http://www.cnblogs.com/season-huang/some%20other%20thing";
其中,空格被編碼成了%20距淫。但是如果你用了encodeURIComponent绞绒,那么結(jié)果變?yōu)?br> "http%3A%2F%2Fwww.cnblogs.com%2Fseason-huang%2Fsome%20other%20thing"
當(dāng)你需要編碼URL中的參數(shù)的時候,那么encodeURIComponent是最好方法榕暇。
題目8: 補(bǔ)全如下函數(shù)处铛,判斷用戶的瀏覽器類型
function isAndroid(){
return /Android/.test(navigator.userAgent);
}
funcnction isIphone(){
return /iphone/.test(navigator.userAgent);
}
function isIpad(){
return /ipad/.test(navigator.userAgent);
}
function isIOS(){
return /(iphone)|(ipad)/i.test(navigator.userAgent);
}