進階11 閉包、定時器、BOM
1.下面的程式碼輸出多少?修改程式碼讓fnArr[i]()
輸出 i。使用 兩種以上的方法
var fnArr = [];
for (var i = 0; i < 10; i ++) {
fnArr[i] = function(){
return i;
};
}
console.log( fnArr[3]() ); //
輸出結果為 10,fnArr[i]()
輸出均為10
修改程式碼:
立即執行函式
for (var i = 0; i < 10; i ++){
!function(j){
fnArr[j] = function(){
return j;
};
}(i);
}
console.log( fnArr[3]() );
自執行函式
for(var i=0; i < 10; i++){
fnArr[i] = function(i){
return function(){
return i;
};
}(i);
}
console.log( fnArr[3]() );
2.封裝一個汽車物件,可以通過如下方式獲取汽車狀態
var Car = (function(){
var speed = 0;
function setSpeed(s){
return speed = s;
}
function getSpeed(){
return speed;
}
function accelerate(){
return speed += 10;
}
function decelerate(){
return speed -= 10;
}
function getStatus(){
var carStatus
if(speed>0){
carStatus = 'running';
}else if(speed===0){
carStatus = 'stop';
}else{
carStatus = 'error';
}
return carStatus;
}
return {
setSpeed: setSpeed,
getSpeed: getSpeed,
accelerate: accelerate,
decelerate: decelerate,
getStatus: getStatus,
};
})();
Car.setSpeed(30);
console.log(Car.getSpeed());//30
Car.accelerate();
console.log(Car.getSpeed());//40;
Car.decelerate();
Car.decelerate();
console.log(Car.getSpeed()); //20
console.log(Car.getStatus()); // 'running';
Car.decelerate();
Car.decelerate();
console.log(Car.getStatus()); //'stop';
Car.decelerate();
console.log(Car.getStatus());
3.下面這段程式碼輸出結果是? 為什麼?
var a = 1;
setTimeout(function(){
a = 2;
console.log(a);
}, 0);
var a ;
console.log(a);
a = 3;
console.log(a);
輸出結果是:1 3 2
分析:
var a = 1;
setTimeout(function(){
a = 2;
console.log('第1個a:'+a);
}, 0);
var a ;
console.log('第2個a:'+a);
a = 3;
console.log('第3個a:'+a);
變數提升:
var a ;
var a ;
a = 1;
console.log('第2個a:'+a);
a = 3;
console.log('第3個a:'+a);
//瀏覽器在執行程式碼時看到定時器setTimeout()會先放在一邊不處理,
//繼續執行後邊的程式碼,完成後再執行setTimeout()
setTimeout(function(){
a = 2;
console.log('第1個a:'+a);
}, 0);
4.下面這段程式碼輸出結果是? 為什麼?
var flag = true;
setTimeout(function(){
flag = false;
},0)
while(flag){}
console.log(flag);
沒有輸出結果
分析:
var flag;
flag = true;
while(flag){} //while(1){}會無限迴圈{}
5.下面這段程式碼輸出?如何輸出delayer: 0, delayer:1...(使用閉包來實現)
for(var i=0;i<5;i++){
setTimeout(function(){
console.log('delayer:' + i );
}, 0);
console.log(i);
}
輸出結果是:0 1 2 3 4 delay:5 delay:5 delay:5 delay:5 delay:5
修改程式碼:
for(var i=0;i<5;i++){
!function(i){
setTimeout(function(){
console.log('delayer:' + i );
}, 0);
}(i)
console.log(i);
}
6. 如何獲取元素的真實寬高
getComputedStyle是一個可以獲取當前元素所有最終使用的CSS屬性值。
var style = window.getComputedStyle("元素", "偽類");
// 第一個引數為元素名,第二個為偽類,可選
var element =document.querySelector('div')
var width = window.getComputedStyle(element).width
var height = window.getComputedStyle(element).height
//相容低版本IE
function trueStyle(element,pse){ return element.currentStyle ? element.currentStyle : window.getComputedStyle(element,pse)
var width = trueStyle(element,pse).width
var height = trueStyle(element,pse)
7.URL 如何編碼解碼?為什麼要編碼?
編碼方式 | 區別 | 解碼方式 |
---|---|---|
encodeURI() |
不會對下列字元編碼:ASCII字母、數字、~!@#$&* ()=:/,;?+'
|
decodeURI() |
encodeURIComponent() |
不會對下列字元編碼:ASCII字母、數字、~!*()'
|
decodeURIComponent() |
原因:url的編碼格式採用的是ASCII碼,而中文不是ASCII的字元,如果不先編碼就傳輸資料,那麼可能會出現問題。所以通過把中文字元編碼為符合ASCII標準的字元,就可以避免這個問題
8.補全如下函式,判斷使用者的瀏覽器型別
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|iPod/i.test(navigator.userAgent);
}
相關文章
- 閉包,定時器以及BOM定時器
- 閉包、定時器定時器
- Python高階 -- 11 閉包、裝飾器Python
- Python進階之閉包和裝飾器Python
- python進階(12)閉包Python
- 【Go進階—基礎特性】定時器Go定時器
- JS學習之Bom(window和定時器)JS定時器
- 【譯】JavaScript進階 從實現理解閉包JavaScript
- python高階-閉包-裝飾器Python
- 前端入門19-JavaScript進階之閉包前端JavaScript
- 測開之函式進階· 第6篇《閉包》函式
- Python高階--閉包Python
- Python進階如何修改閉包內使用的外部變數?Python變數
- JS進擊之路:閉包JS
- Rust 程式設計影片教程(進階)——028_2 返回閉包Rust程式設計
- js 閉包 基礎 示例 高階JS
- 什麼是過時閉包及如何解決過時閉包的坑
- Rust 程式設計視訊教程(進階)——028_2 返回閉包Rust程式設計
- Rust 程式設計視訊教程(進階)——005_1 閉包介紹Rust程式設計
- 前端基礎進階(四):詳細圖解作用域鏈與閉包前端圖解
- (原)BOM斷階原則
- 從for迴圈中的定時器說開去,閉包和非同步的一點事兒定時器非同步
- JavaScript進階教程(5)-一文讓你搞懂作用域鏈和閉包JavaScript
- JavaScript進階系列01,函式的宣告,函式引數,函式閉包JavaScript函式
- BOM選擇設定
- 進擊的 JavaScript(四) 之 閉包JavaScript
- 高階BOM工具智慧打包功能
- 多階BOM查詢程式碼
- 設定模式基礎 之 3閉包模式
- 微服務之BOM定義微服務
- SDL程式設計入門(23)高階定時器程式設計定時器
- Python閉包與裝飾器Python
- 【python】閉包與裝飾器Python
- python 閉包和裝飾器Python
- 求多階BOM查詢程式碼
- 定時自動開啟和關閉Azure虛擬機器虛擬機
- 定時關閉AWS上的EC2機器例項
- 【Python語法】循序漸進理解閉包Python