閉包和定時器

題目1:下面的代碼輸出多少?修改代碼讓fnArri 輸出 i。使用兩種以上的方法

var fnArr = []; 
for (var i = 0; i < 10; i ++) { 
        fnArr[i] = function(){
        return i; 
    };
} 
//輸出10,執行的時候i等于10,所以整個數組元素執行后都會是10
console.log( fnArr[3]() ); 

作用域鏈:

globalContext = {
    AO:{
          fnArr:[function1,function2,...,function10] 
          i:10
          function1:
          function2:
          ...
          function10:
    }
    scope:null
}
function1.[[scope]] = globalContext.AO;
function2.[[scope]] = globalContext.AO;


function1Context = {
    AO:{
    }
    scope:function1.[[scope]];//globalContext.AO;
}
function2Context = {
    AO:{
    }
    scope:function2.[[scope]];//globalContext.AO;
}

法一:

var fnArr = []; 
for (var i = 0; i < 10; i ++) { 
       (function(i){ 
             fnArr[i] = function(){ 
                   return i; 
             } 
      })(i); 
}
console.log( fnArr[3]() ); //3

作用域鏈:

globalContext = {
    AO:{
          fnArr:[function11,function22,...,function1010]
          i:
          function1:
          function2:
          ...
          function10:
    }
    scope:null
}
function1.[[scope]] = globalContext.AO;
function2.[[scope]] = globalContext.AO;


function1Context = {
    AO:{
        i:0;
        function11:
    }
    scope:function1.[[scope]];//globalContext.AO;
}
function11.[[scope]] = function1Context.AO;
function11Context = {
    AO:{
    }
    scope:function11.[[scope]];//function1Context.AO;
}

function2Context = {
    AO:{
         i:1;
        function22:
    }
    scope:function2.[[scope]];//globalContext.AO;
}
function22.[[scope]] = function2Context.AO;
function22Context = {
    AO:{
    }
    scope:function22.[[scope]];//function2Context.AO;
}

法二:

var fnArr = []; 
for (var i = 0; i < 10; i ++) {     
    fnArr[i] = (function(i){ 
    //IIFE & 閉包 
          return function(){ 
                return i;           
        }       
    })(i);  
} 
console.log( fnArr[3]() ); //3

作用域鏈:

globalContext = {
    AO:{
          fnArr:[function1,function2,...,function10]
          i:
          function1:
          function2:
          ...
          function10:
    }
    scope:null
}
function1.[[scope]] = globalContext.AO;
function2.[[scope]] = globalContext.AO;


function1Context = {
    AO:{
        i:0;
        function11:
    }
    scope:function1.[[scope]];//globalContext.AO;
}
function11.[[scope]] = function1Context.AO;
function11Context = {
    AO:{
    }
    scope:function11.[[scope]];//function1Context.AO;
}

function2Context = {
    AO:{
         i:1;
        function22:
    }
    scope:function2.[[scope]];//globalContext.AO;
}
function22.[[scope]] = function2Context.AO;
function22Context = {
    AO:{
    }
    scope:function22.[[scope]];//function2Context.AO;
}

法三:

var fnArr = [];
 for (let i = 0; i < 10; i ++) {
 //使用ES6: let 
        fnArr[i] = function(){ 
              return i;
        }; 
} 
console.log( fnArr[3]() );

題目2:封裝一個汽車對象,可以通過如下方式獲取汽車狀態


var Car = (function () { 
    let speed = 0; 
    function setSpeed(s){ 
        return speed = s;
    }
    function getSpeed(){ 
        return speed; 
    } 
    function accelerate(){ 
        return speed+=10; 
    } 
    function decelerate(){ 
        //速度不能為負數 
        return speed>0?speed-=10:speed; 
    } 
    function getStatus(){ 
        return speed>0?'running':'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

代碼:

var Car = {
    speed:0,
    setSpeed:function(s){
        return speed = s;
    },
    getSpeed:function(){
        return speed;
    },
    accelerate:function(){
        return speed+=10;
    },
    decelerate:function(){ //速度不能為負數
        return speed>0?speed-=10:speed;
    },
    getStatus:function(){
        return speed>0?'running':'stop';
    },
};

題目3:下面這段代碼輸出結果是? 為什么?

var a = 1;
setTimeout(function(){ 
    a = 2;
    console.log(a);//2
}, 0); //參數為0,被放入執行隊列的最后
var a ;
console.log(a); //1
a = 3;
console.log(a); //3

結果:1,3,2

題目4:下面這段代碼輸出結果是? 為什么?

var flag = true;
setTimeout(function(){
    //等待所有任務結束后執行 
    flag = false;
},0)
while(flag){} //setTimeout會等待它執行完畢,此時flag永遠是true,無限循環。
console.log(flag); //不會執行

題目5:下面這段代碼輸出?如何輸出delayer: 0, delayer:1...
(使用閉包來實現)

for(var i=0;i<5;i++){ 
(function(t){
    //參數變量提升 let t; 
    return setTimeout(function(){ 
            console.log('delayer:' + t );
        }, 0);
 })(i); 
 
console.log(i);
}```
題目6: 如何獲取元素的真實寬高?

function trueStyle(element,pseduoElement){
//IE不支持window.getComputedStyle(),支持element.currentStyle();
return element.currentStyle ? element.currentStyle : window.getComputedStyle(element,pseduoElement);
}
let trueWidth = trueStyle(element).width;
let trueHeight = trueStyle(element).height;

題目7:URL 如何編碼解碼?為什么要編碼?

let myURL = 'https://www.google.com/#q=javascript';
//如果我們想編碼一個URL并且可以使用它(訪問),使用encodeURI();
let simpleURL = encodeURI(myURL); //"https://www.google.com/#q=javascript"
//如果我們想編碼一個URL并且可以將其放置在某URL的參數中,使用encodeURIComponent();
let completeURL = encodeURIComponent(myURL);
let newURL = 'https://www.google.com/?back=' + completeURL;
//"https://www.google.com/?back=https%3A%2F%2Fwww.google.com%2F%23q%3Djavascript"
window.open(simpleURL); //將會打開一個窗口,地址為https://www.google.com/#q=javascript


題目8:補全如下函數,判斷用戶的瀏覽器類型

function isAndroid(){
return /Android/.test(navigator.userAgent);
}
function isIphone(){
return /iPhone/.test(navigator.userAgent);
}
function isIpad(){
return /iPad/.test(navigator.userAgent);
}
function isIOS(){
return /(iPad)|(iPhone)/i.test(navigator.userAgent);
}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,572評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,071評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,409評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,569評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,360評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,895評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,979評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,123評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,643評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,559評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,742評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,250評論 5 356
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,981評論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,363評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,622評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,354評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,707評論 2 370

推薦閱讀更多精彩內容

  • 題目1: 下面的代碼輸出多少?修改代碼讓fnArri 輸出 i。使用兩種以上的方法 第一種: 第二種: 題目2: ...
    大大的蘿卜閱讀 290評論 0 0
  • setTimeout的語法 更新于2017年4月9號 問題 1.什么是閉包?有什么作用 閉包:一個變量,一個函數(...
    sunny519111閱讀 188評論 0 0
  • 題目1: 下面的代碼輸出多少?修改代碼讓fnArr[i]() 輸出 i。使兩種以上的方法 題目2: 封裝一個汽車對...
    Gia_Mo閱讀 501評論 0 0
  • 題目1: 下面的代碼輸出多少?修改代碼讓fnArri 輸出 i。使用兩種以上的方法 輸出:10 method 1:...
    饑人谷_js_chen閱讀 277評論 0 1
  • 愛上很多人。
    cdccff66b278閱讀 249評論 0 0