題目1: 下面的代碼輸出多少?修改代碼讓 fnArri 輸出 i。使用 兩種以上的方法
var fnArr = [];
for (var i = 0; i < 10; i ++) {
fnArr[i] = function(){
return i;
};
}
console.log( fnArr[3]() ); // 10
方法1:
var fnArr = [];
for (var i = 0; i < 10; i ++) {
var t = function () {
var a = i;
return function () {
return a;
}
}()
fnArr[i] = t
}
console.log( fnArr[3]() );
方法2:
var fnArr = [];
for (var i = 0; i < 10; i ++) {
!function (i) {
fnArr[i] = function(){
return i;
}
}(i)
}
console.log( fnArr[3]() );
題目2: 封裝一個汽車對象,可以通過如下方式獲取汽車狀態
var Car = (function(){
var speed = 0;
function setSpeed(s){
speed = s
}
function accelerate() {
speed += 10;
}
function decelerate() {
if(speed>0){
speed -= 10;
}
}
function getStatus() {
if(speed>0){
console.log('running')
}else {
console.log('stop')
}
}
function getSpeed() {
console.log(speed)
}
return {
setSpeed: setSpeed,
accelerate: accelerate,
decelerate: decelerate,
getStatus: getStatus,
getSpeed: getSpeed
}
})()
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:下面這段代碼輸出結果是? 為什么?
var a = 1;
setTimeout(function(){
a = 2;
console.log(a);
}, 0);
var a ;
console.log(a);
a = 3;
console.log(a);
// 輸出結果:
// 1 輸出的是var a = 1的值,由于變量提升重新聲明對值無影響
// 3 輸出的是a = 3
// 2 輸出的是setTimeout里函數中a=2的值,因為有setTimeout所以會等待其它代碼執行完再執行函數。
題目4:下面這段代碼輸出結果是? 為什么?
var flag = true;
setTimeout(function(){
flag = false;
},0)
while(flag){}
console.log(flag);
//不會輸出結果,因為因為有setTimeout所以會等待其它代碼執行完再執行當中的函數,while(flag){}中的flag一直為true,不會退出循環。
題目5: 下面這段代碼輸出?如何輸出delayer: 0, delayer:1...(使用閉包來實現)
for(var i=0;i<5;i++){
setTimeout(function(){
console.log('delayer:' + i );
}, 0);
console.log(i);
}
setTimeout中的所有i訪問的都是全局的i,而setTimeout的回調函數會在for循環執行完畢后執行所以此時i的值為5
輸出:
// 0
// 1
// 2
// 3
// 4
// delayer:5
// delayer:5
// delayer:5
// delayer:5
// delayer:5
修改:
for(var i=0;i<5;i++){
!function (i) {
setTimeout(function(){
console.log('delayer:' + i );
}, 0);
}(i)
}
題目6: 如何獲取元素的真實寬高
通過 getComputedStyle (IE 下 currentStyle)獲得元素的真實尺寸。
var logo = document.querySelector('#result_logo')
aa = window.getComputedStyle(logo)
aa.height
aa.width
logo寬高
題目7: URL 如何編碼解碼?為什么要編碼?
- 解碼:
decodeURIcomponent()
decodeURI
將UTF8編碼解碼為相應字符 - 編碼:
encodeURIComponent()
encodeURI
使用一到四個轉義序列來表示字符串中的每個字符的UTF-8編碼,
encodeURI和encodeURIComponent的區別在于前者被設計來用于對完整URL進行URL Encode,于是URL中的功能字符,比如&, ?, /, =等等這些并不會被轉義;而后者被設計來對一個URL中的值進行轉義,會把這些功能字符也進行轉義 - 為什么要編碼:URL只能使用英文字母、阿拉伯數字和某些標點符號,不能使用其他文字和符號。
題目8: 補全如下函數,判斷用戶的瀏覽器類型
ua = window.navigator.userAgent
function isAndroid(){
return ua.search(/Andriod/)>-1 || ua.search(/adr/)>-1
}
function isIphone(){
return ua.search(/iPhone/)>-1
}
function isIpad(){
return ua.search(/iPad/)>-1
}
function isIOS(){
return ua.search(/OS/)>-1
}