首頁  >  文章  >  web前端  >  深入理解javascript中的左查詢和右查詢

深入理解javascript中的左查詢和右查詢

零到壹度
零到壹度原創
2018-04-04 10:41:493997瀏覽

這篇文章主要介紹了深入理解javascript中的左查詢和右查詢,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟著小編過來看看吧

值與引用

作用域

  • 狹義上說作用域就是一個物件(更確切的來說應該是集合);

  • 廣義上來說作用域是一套用來儲存變量,並且之後可以方便的找到這些變量的規則;

    • #作用域負責收集並維護由所有聲明的標識符組成的一系列查詢,並實施一套非常嚴格的規則,確定目前執行的程式碼對這些識別碼的存取權限。

上下文

  • 程式碼(全域程式碼,函數體,eval程式碼)執行前的準備工作:

    • 1.提升(變數函數函數表達式);

    • #2.確定this指向;

    • #3.與對應作用域關聯;

    • 如果程式碼段是函數體,那麼在此基礎上需要附加:參數賦值,arguments 賦值;

  • 作用域與執行上下文環境的關係:

    • #一個作用域下可能包含若干個上下文環境。有可能從來沒有上下文環境(函數從來就沒有被呼叫過);有可能有過,現在函數被調用完畢後,上下文環境被銷毀了;

    • 左/右查詢

    左查詢:
    • #賦值符號的左側,賦值運算的目標是誰;
    • 函數呼叫時實參與形參的關係就是一次左邊查詢;
    • #對等號左邊變數的查詢。在整個作用域鏈中,如果沒有找到變數的聲明,js引擎會自動在全域宣告一個同名變數;但是這個變數的宣告是不會提升的。
    • (function(){
          function test(a){
              b=a;
              console.log(b);//2
          }
          test(2);
      })();
      console.log(b);//2

  • 右派查詢:

    • #賦值符號的非左側,誰是賦值運算的源頭;

    • 對等號非左邊變數的查詢。在整個作用域鏈中,如果沒有找到變數的宣告直接拋ReferenceError錯誤;

      console.log(a);//ReferenceError: a is not defined

    • 特殊的右邊查詢

      //a并未定义赋值
      console.log(typeof a);//undefined

    • 嚴格模式&非嚴格模式

    • RHS,LHS都會拋出ReferenceError異常

    • ##ReferenceError異常同作用域判別失敗相關,TypeError則代表作用域判別成功了,但對結果的操作是非法或不合理的;

    • ##右查詢在查詢所有的嵌套作用域中遍尋不到所需的變量,引擎就會拋出ReferenceError異常,但需要注意typeof時不會報異常;

  • 左查詢在查詢所有的巢狀作用域中遍尋不到所需的變量,全域作用域中就會建立一個具有該名稱的變數;

    • 在變數尚未宣告(在任何作用域中都無法找到該變數)的情況下,這兩種查詢的行為是不一樣的
    • 非嚴格模式:
    嚴格模式:

typeof的安全防範機制

#1.在程式中使用全域變數DEBUG作為「偵錯模式」開關,我們在DEBUG.js檔案的宣告var DEBUG =true;該檔案只在開發和測試時才被載入到瀏覽器,在生產環境中不予載入;

if(DEBUG){ //在生产环境中会报错
         console.log("开始调试");
  }  if(typeof DEBUG !== "undefined"){
          console.log("开始调试");    
  }
2 .為某個缺少的功能寫polyfill(襯墊程式碼,用來補充目前運行環境中缺少的功能)
if(typeof polyfill_a === "undefined"){        //注意这一块不需要var,跟变量的提升有关
           //这一块需要使用函数表达式而不是函数声明
           polyfill_a = function(){
              //功能代码
           }
   }

############相關推薦:### ############左右查詢與內查詢###################左查詢與右派查詢區別##########

以上是深入理解javascript中的左查詢和右查詢的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn