JavaScript面接問題(三)

5129 ワード

一、以下のコードの出力結果はいくらですか?
for(var i=0;i<5;i+){
        setTimeout(function(){
        console.log(i);
        },1000);
    
    }
55555はどうなりますか?
    for(var i=0;i<5;i++){
        (function(i){
            setTimeout(function(){
            console.log(i);
            },1000);
        })(i);
        
        }
二、this指向問題
1、グローバルスコープ内で、thisはwindow 2、関数内部のthis指向関数実行時の直接使用者3、構造関数中のthisはnewキーワードを指して作成された例示的なオブジェクトを指します.
補足:矢印関数のthisは、実行時にオブジェクトを呼び出すのではなく、定義時にthisにある宿主オブジェクトを指します.
参考文献:jsの中のthisの指向を徹底的に理解し、あえて暗記する必要はない.ES 6矢印関数のthisと各種thisの面接問題を深く理解してまとめます.
三、カウントダウン関数を実現します.秒殺に似ています.
    window.onload=function(){

        var time=Date.UTC(2017,9,10,23-8,0,0);//          (  )
        var counter=setInterval(function (){
            var temp=Date.now();//      (   )
            if(temp<=time){//            
               console.log(Math.floor((time-temp)/1000));//      
            }else{
                clearInterval(counter);//        ,     
            }

        },1000);
    };
解析:Date.UTC(年、月-1、日、時、分、秒)は、現在のタイムゾーンのミリ秒数を返します.Date.now()はGMT時間、すなわちグリニッジ時間のミリ秒数を返します.
四、変数のスコープを説明する
1、変数のスコープ:グローバルスコープと関数スコープ.2、関数の内部ではグローバル変数を直接読み込むことができますが、関数の外部では関数内部の変数を読み取ることができません.
五、ブロックレベルのスコープ(自己実行関数)を模仿する.
JavaScriptには、ブロックレベルのスコープという概念はありませんが、関数スコープがあります.したがって、スコープレベルのスコープを関数スコープで模倣することができます.1、方法:匿名関数を定義し、直ちに呼び出します.
(function(){
//        
})();
このように匿名関数で定義された任意の変数は匿名関数の実行終了時に破棄されます.
五、閉め切ってください
1、定義:他の関数の内部変数の関数を読み取ることができます.
2、用途:
①ブロックレベルのスコープを模して(関数を作成してすぐに呼び出します).②アクセス関数のプライベート変数とプライベート関数の特権方法を設定します.③モジュールモード:単例でプライベート変数と特権方法を作成します.
3、短所:
①クローズドは、関数の変数がメモリに保存されますので、メモリの消耗が大きいので、クローズドを濫用することはできません.性能に問題があります.解決方法:関数を終了する前に、使用しない部分変数を全部削除します.②親関数の外で親関数の内部変数の値を変更します.したがって、親レベルの関数を対象として使用する場合は、クローズドをそのパブリックメソッドとして、内部変数をそのプライベート属性として扱います.この時は親関数内部変数の値を勝手に変えないように注意してください.
4、どうやってクローズド中の局部変数を解放しますか?
個人的な推計:親関数の戻り値は、サブ関数として変数testに割り当てられます.クローズドされた部分変数をリリースすると、testをnullに再割り当てできます.親関数の戻りのサブ関数を参照していない変数ができます.参考文献:クローズド?クローズドの長所と短所は何ですか?「JavaScriptアドバンストプログラム設計」
六、ゴミ収集
一)JavaScript自動ごみ収集メカニズムの原理:
これ以上使用しない変数を探し出して、占有されたメモリを解放します.このため、ゴミ収集器は、固定された時間間隔(またはコード実行中の携帯電話の時間)で周期的に実行されます.
二)不要変数を識別するポリシー:
1、マーククリア
①変数が環境に入ると、変数は「環境に入る」とマークされます.環境に入る変数によって使われているメモリは永遠に解放されません.②変数が環境から離れると、それを「環境から離れる」とマークします.ごみ収集器はマークが付いた値を破棄して、メモリ空間を回収します.
2、参照カウント(一般的ではない)
原理:各値が参照された回数を追跡記録します.①宣言された変数に一つの値を付与します.この値の参照回数は1です.②同じ値を他の変数に割り当てると、その値の参照回数は+1です.③この値を含む変数は他の値を取得します.この値の参照回数は-1です.④この値の参照回数が0になると、無効となります.この値にアクセスしたので、メモリの容量を回収することができます.
--問題があります.循環参照定義:オブジェクトAには、オブジェクトBを指すポインタが含まれています.オブジェクトBには、オブジェクトAを指すポインタも含まれています.例えば、
function problem(){
var objectA=new Object();
var objectB=new Object();
objectA.someOtherObject=objectB;
objectB.anotherObject=objectA;
}
この例では、object AとObject Bはそれぞれの属性で相互参照され、参照回数は2回です.関数が実行された後、object AとObjectBの参照回数は0ではなく、また存在します.この関数が何度も呼び出されると、大量のメモリが回収されなくなります.
七、イベントloop
プログラムには2つのスレッドが設置されています.1つはプログラム自体の実行を担当しています.「マスタスレッド」と呼ばれています.もう1つはメインスレッドと他のプロセス(主にI/O操作)との通信を担当しています.「Event Loopスレッド」と呼ばれています.I/Oが発生するたびに、メインスレッドはEvent Loopスレッドに対応するI/Oプログラムを通知し、その後に実行します.現在のI/Oによってはブロックされません.I/Oプログラムが完了するまで、Event Loopスレッドはその結果をメインスレッドに戻します.マスタスレッドは事前に設定したコールバック関数を呼び出して、タスク全体を完了します.このような動作は「非同期モード」または「非同期モード」と呼ばれます.「非ブロッキングモード」です.
補足:単一スレッドモードはJavaScriptをより簡単にし、より少ないリソースを占有します.参照文献:Event Loopとは何ですか?
八、関数宣言と関数表現
1、関数宣言:
function sum(num1,num2){
        return num1+num2;
}
解析器は実行環境にデータをロードする際に、まず関数宣言を読み取り、任意のコードを実行する前に利用可能にします.例1:
console.log(sum(10,10));
function sum(num1,num2){
        return num1+num2;
}
上記の例では、sumの関数宣言の前に関数を呼び出すことができます.2、関数式:
var  sum=function(num1,num2){
        return num1+num2;
};
関数式については、解像度がそのコード行に実行されるまで、本当に解釈されて実行される必要があります.
console.log(sum(10,10));
var sum=function(num1,num2){
        return num1+num2;
};
上記の例では、コードはエラーとなります.関数宣言ではなく初期化文に関数があります.言い換えれば、関数のある文に実行する前に、変数sumには関数への参照は保存されません.また、最初の行のコードが原因で、「unexpected identifer」という意外な識別子が間違っています.実際には次の行にも実行されません.
九、ラベルの位置
すべてのJavaScriptを要素のページ内容の後ろに引用することを推奨します.このようにJavaScriptコードを解析する前に、ページの内容は完全にブラウザに表示されます.ユーザもブラウザウィンドウの空白ページの表示時間が短くなるので、ページを開くスピードが速くなると感じます.「text/javascript」src=「example 2.js」/>

参考文献:
JavaScriptシニアプログラム設計
<h 4>10、ディレイシナリオと非同期スクリプト(/h 4)
<h 6>1、ディレイシナリオ:

HTML 4.01にdefer属性を導入します.(下位バージョンIEサポート)
役割:ブラウザにすぐにスクリプトをダウンロードするように伝えますが、スクリプトを全ページ解析が完了したら実行します.




Example HTML Page







<p> :HTML 5 は、 の シナリオを することが されていますが、 には、 スクリプトは ずしも りに されていません.


<h 6>2、 シナリオ
<p>HTML 5にはasync が されています.( バージョンのIEはサポートされていません)
:ブラウザに ちにスクリプトをダウンロードするように えますが、スクリプトのダウンロードと を つ はありません.ページの の を に み むことができます.