作用域面試總結(持續更新系列~)

来源:https://www.cnblogs.com/jianger/archive/2018/12/02/10055280.html
-Advertisement-
Play Games

先說幾個概念: 1、js代碼從上往下執行 2、變數提升: 變數提升是瀏覽器的一個功能,在運行js代碼之前,瀏覽器會給js一個全局作用域叫window,window分兩個模塊,一個叫記憶體模塊,一個叫運行模塊,記憶體模塊找到當前作用域下的所有帶var和function的關鍵字,執行模塊執行js代碼,從上到 ...


先說幾個概念:

   1、js代碼從上往下執行 

   2、變數提升:

     變數提升是瀏覽器的一個功能,在運行js代碼之前,瀏覽器會給js一個全局作用域叫windowwindow分兩個模塊,一個叫記憶體模塊,一個叫運行模塊,記憶體模塊找到當前作用域下的所有帶var和function的關鍵字,執行模塊執行js代碼,從上到下執行,遇到變數就會通過記憶體地址去查找這個變數,有和沒有這個變數。有這個變數就會看賦值沒賦值,如果賦值就是後面的值,如果沒有賦值就是undefined,如果沒有找到就說這個變數 is not defined。

   3、作用域鏈:

      當函數內部的變數被使用時,首先會在自己的私有作用域下查找是否有這個變數,如果有就使用,如果沒有就會向上一級(父級)查找,父級有就使用父級的,如果沒有就繼續向上一級找,有就使用,沒有就接著往上找,直到window,window有就用,沒有就是is not defined。我們管這種查找機制叫做作用域鏈。

 

 

一、簡單的小案例:

    1、

      var a = 12;

    function fn(){

      console.log(a);  //undefined

      var a = 45;

      console.log(a);  //45

    }

     2、

      function fn(){

      console.log(11);

      function ff(){

        console.log(22);

      }

      ff();

    }

    fn()  //11

    ff()  // ff is not defined

     3、

       var   a = 123;
    function  fun(){
     alert(a)  //123
    }
    fun();      //私有作用域下沒有聲明變數a,就在父級找,有就直接使用。

     4、

       var   a = 123;
    function   fun(){
      alert(a);  //123    私有作用域里並沒有聲明變數a,所以就在父級找,有就直接使用。
      a = 456;
     }
     fun()
     alert(a)  //456      fun()里改變了全局變數a的值

     5、

       var   a = 123;
    function   fun(a){
      alert(a);  //undefined    這裡有形參,但是並沒有傳實參 
      a = 456;    //給參數賦值
    }
    fun();
    alert(a)  //123    全局變數a

     6、

       var   a = 123;
       function    fun(a){
        alert(a);  //123      這裡傳了固定的參數123
        a = 456;
       }
       fun(123)
       alert(a)  //123

     7、

       var   a = 12;
    function   fn(){
      console.log(a)  //undefined      代碼從上往下執行,記憶體模塊只定義,不賦值。
      var   a = 45;
       console . log(a)  //45
    }
    fn()

     8、

       function test(a,b){
         console . log(b)  //function b(){}       function關鍵字,在記憶體模塊裡面聲明和定義同時進行
         console . log(a)  //1   
         c=0;
         a=3;
         b=2;
         console . log(b);    //2
         function   b(){ }
         function   d(){ }
         console . log(b)    //2
       }
       test(1)

     9、

       function   test(a,b){
         console . log(a)  //function  a(){}  覆蓋了實參
         console . log(b)  //undefined
         var   b=234;
         console . log(b)  //234
         a=123;
         console . log(a)  //123
         function   a(){ }
         var   a;
         b=234;
         var   b=function (){ }
         console . log(a);  //123
         console . log(b) //function
       }
       test(1)

       

二、阿裡面試:

    var a = 100;

    function testResult(){

      var b = 2 * a;

      var a = 200;

      var c = a / 2;

      alert(b);

      alert(c);

    }

    

 

三、自調用函數:

    +function(){

      console.log(a);

      var a = 5;

      function a(){}

      console.log(a);

      function b(){}

      b = 6;

      console.log(b);

      var c = d = b;

    }()

    console.log(d);

    console.log(c);

註:自調用函數沒有變數提升!

 

      

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 準備工作 150G及以上的硬碟空間(因為要搭建3個系統組成的集群),cpu儘量i7-7xxx標壓以上,記憶體16G及以上 自行搜索,下載,安裝VMWare 準備CentOS6.8的鏡像文件 註意:安裝虛擬機前必須開啟BIOS虛擬化支持 安裝CentOS 右鍵剛剛創建好虛擬機,在菜單中選擇"設置"選項 ...
  • 介紹 索引用於加快數據訪問的速度。把電腦的磁碟比作一本字典,索引就是欄位的目錄,當我們想快速查到某個詞語的時候只需要通過查詢目錄找到詞語所在的頁數,然後直接打開某頁就可以。MySQL最常用的索引是B+樹索引,為什麼使用B+作為MySQL的索引,這是許多面試官必問的問題。 為什麼B+樹 硬體相關知識 ...
  • 一.概述 Redis伺服器是一個事件驅動程式,伺服器需要處理兩類事件:1文件事件,2時間事件。文件事件是關於客戶端與伺服器之間的通信操作。時間事件是關於伺服器內部的一些定時操作。本篇還是參照"Redis設計與實現"書,簡要瞭解下Redis事件。 1. 文件事件 文件事件(file event)是服務 ...
  • 數據備份恢覆在資料庫管理中至關重要,今天,總結一下資料庫備份與恢復的方案,需要註意的方面和實際操作!、 ...
  • 大數據大數據,個個都在喊 但究竟什麼是大數據開發,如何成為一個大數據開發工程師? 我還是要推薦下我自己創建的大數據資料分享群142973723,這是大數據學習交流的地方,不管你是小白還是大牛,小編都歡迎,不定期分享乾貨,包括我整理的一份適合零基礎學習大數據資料和入門教程。 大數據通用處理平臺 1. ...
  • 時間序列資料庫簡稱時序資料庫(Time Series Database),用於處理帶時間標簽(按照時間的順序變化,即時間序列化)的數據,帶時間標簽的數據也稱為時間序列數據。 時序數據的幾個特點 1. 基本上都是插入,沒有更新的需求。 2. 數據基本上都有時間屬性,隨著時間的推移不斷產生新的數據。 3 ...
  • 0.準備工作: 關閉itunes 在任務管理器中殺掉iTunes開頭的服務 1,找到iTunes預設備份路徑:C:\Users\xxx\AppData\Roaming\Apple Computer\MobileSync xxx為里的用戶名 2,刪掉預設路徑下的MobileSync文件夾,以前有備份的 ...
  • frameset 定義 W3C是這樣定義frameset框架的,通過使用框架,你可以在同一個瀏覽器視窗中顯示不止一個頁面。每份HTML文檔稱為一個框架,並且每個框架都獨立於其他的框架。註意,這是HTML框架,不是前端框架,與node.js,vue.js等不同。 垂直切割 屬性為cols。例如: <f ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...