javascript概念

 做用域: js沒有塊做用域,只有函數做用域javascript

 做用域鏈: 按序檢索對象列表java

 自執行函數:擁有私有做用域數組

 匿名函數:this -> window函數

 初始化: 全局對象, 執行環境棧, 全局執行環境this

 類數組(僞數組): 可像數組索引,有length屬性,可是沒有數組的方法,實際上是個對象spa

    例: arguments是一個object對象prototype

    Array.prototype.slice.call(arguments, 0)是用來將arguments變量轉換爲真正的數組.code

    Arguments的屬性callee都會指向當前的被調函數.(可用於遞歸匿名函數)對象

    [1] callee與caller遞歸

        caller返回一個函數的引用,這個函數調用了當前的函數;

      使用這個屬性要注意:
       1. 這個屬性只有當函數在執行時纔有用
       2. 若是在javascript程序中,函數是由頂層調用的,則返回null

          var a = function() { 

          alert(a.caller); 
        } 
        var b = function() { 
          a(); 
        } 
        b(); // var b = function() { a(); }

預編譯: 聲明提早(hoisting)

  1)函數聲明會置頂

  2)變量聲明也會置頂

  3)函數聲明 > 變量聲明

  4)變量和賦值語句一塊兒書寫,在js引擎解析時,會將其拆成聲明和賦值2部分,聲明置頂,賦值保留在原來位置

  5)聲明過的變量不會重複聲明

  同一個標識符的狀況下,變量聲明與函數聲明都會提高;函數聲明會覆蓋變量聲明,但不會覆蓋變量賦值,即:若是聲明變量的同時初始化或賦值,

  那麼變量優先級高於函數。

  *屢次聲明變量,只取最後值

函數表達式

  (1) 要清楚二者的區別:

       (function {// code})是表達式, function {// code}是函數聲明.

   (2) js"預編譯"的特色:

       js在"預編譯"階段, 會解釋函數聲明, 但卻會忽略表式.

   (3) 當js執行到function() {//code}();時, 因爲function() {//code}在"預編譯"階段已經被解釋過,

     js會跳過function(){//code}, 試圖去執行(), 故會報錯;

     當js執行到(function {// code})();時, 因爲(function {// code})是表達式, js會去對它求解獲得返回值,

     因爲返回值是一 個函數, 故而遇到();時, 便會被執行.

   (4) 函數轉換爲表達式的方法並不必定要靠分組操做符(),咱們還能夠用void操做符,~操做符,!操做符……

      如:!function(){  alert("另類的匿名函數自執行"); }();

相關文章
相關標籤/搜索