JavaScript 關於變數作用域的一道面試題

来源:http://www.cnblogs.com/shinejaie/archive/2016/03/08/5253034.html
-Advertisement-
Play Games

ShineJaie 原創,轉載請註明出處。 昨晚在一個交流群里看到有位網友提了一個他的面試題求助答疑。剛好我也有看到,就對這個問題思考了一下,覺得這道題對理解 JavaScript 作用域還是很有幫助的,特此又把自己的解題思路梳理了一遍,希望對其它人有所幫助。 首先看下麵試題: 1 var arr


ShineJaie 原創,轉載請註明出處。

昨晚在一個交流群里看到有位網友提了一個他的面試題求助答疑。剛好我也有看到,就對這個問題思考了一下,覺得這道題對理解 JavaScript 作用域還是很有幫助的,特此又把自己的解題思路梳理了一遍,希望對其它人有所幫助。

首先看下麵試題:

 1     var arr = [1, 2, 3];
 2     for (var i = 0, j; j = arr[i++];) {
 3         console.log(j);
 4     }
 5 
 6     console.log('---------');
 7     console.log(i);
 8     console.log('---------');
 9     console.log(j);
10     console.log('---------');

 

在解題前,我們先回顧下 JavaScript 中,變數域相關的知識。

全局變數(Global)

全局變數是指在任何地方都可以訪問的變數,有兩種情況

  • 在 function 外面聲明,不論是否用 var 關鍵字
  • 在 function 裡面聲明,不使用 var 關鍵字,當然聲明的語句必須被執行才可以

局部變數(Local ) 

局部變數只能在被聲明的 function 內部才能訪問
  • 在 function 裡面聲明,使用 var 關鍵字

兩點要註意的地方

先看代碼:

1 alert(i); // 輸出 undefined
2 
3 for (var i = 0; i < 1; i++){};
4 
5 alert(i); // 輸出1
  • JavaScript 不存在語句作用域,在語句內定義的變數會擴散到語句外邊, 例子中 i 在 for 語句中聲明,但是在 for 語句的外面任然可以訪問
  • 在 for 語句之前就可以訪問到 i ,只不過這時候還沒有被賦值

開始我們的解題

i++ 是在 i 使用後再自加:

第一次執行時,j=arr[0],之後 i=1,console.log(j) 輸出 1 

第二次執行時,j=arr[1],之後 i=2,ocnsole.log(j) 輸出 2

第三次執行時,j=arr[2],之後 i=3,ocnsole.log(j) 輸出 3

第四次(不符合 for  條件),j=arr[3] 為 undefined,之後 i=4,ocnsole.log(j) 沒有輸出,退出 for 迴圈

for 語句執行結束後,console.log(i) 由上分析可知輸出 4,console.log(j) 輸出 undefined

最後輸出結果為:

1
2
3
---------
4
---------
undefined
---------

針對上面的分析和結果,想必大家都已經搞清楚了吧,然後我們開始舉一反三吧。

借題改題一

題目:

 1     var arr = [1, 2, 3];
 2     for (var i = 0, j; j = arr[++i];) {
 3         console.log(j);
 4     }
 5 
 6     console.log('---------');
 7     console.log(i);
 8     console.log('---------');
 9     console.log(j);
10     console.log('---------');

答案:

1 2
2 3
3 ---------
4 3
5 ---------
6 undefined
7 ---------

借題改題二

題目:

 1     function xxx() {
 2         var arr = [1, 2, 3];
 3         for (var i = 0, j; j = arr[i++];) {
 4             console.log(j);
 5         }
 6     }
 7     xxx();
 8 
 9     console.log('---------');
10     console.log(i);
11     console.log('---------');
12     console.log(j);
13     console.log('---------');

答案:

1
2
3
---------
報錯:Uncaught ReferenceError: i is not defined

 


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

-Advertisement-
Play Games
更多相關文章
  • 介紹vw、vh,然後對三篇文章做一個總結。屏幕適配是一個很容易被忽略的問題,但對於精益求精的產品而言,是必不可少的。對於Web開發的求職者而言,也是一個必需要理解清楚的經典問題
  • 回到占占推薦博客索引 bootstrap已經用了有段時間了,感覺在使用上還是比較容易接受的,在開發人員用起來上,也還好,不用考慮它的相容性,手機,平臺,PC都可以有效的相容。 bootstrap官方api:http://v3.bootcss.com/ Bootstrap~學習筆記索引 Bootstr
  • 一:需求分析 1)需要首頁,末頁功能 2)有點擊查看上一頁,下一頁功能 3)頁碼到當前可視頁碼最後一頁刷新頁面 二:功能實現思路 也是分為三部分處理 1)點擊首頁,末頁直接顯示第一頁或者最後一頁內容,當前頁面為第1頁或者最後一頁。隱藏首頁或者末頁按鈕。demo 顯示截圖 首頁狀態 和 末頁狀態代碼執
  • HTML 教程 HTML 簡介 html div 標簽介紹 html span 標簽介紹 html a 超鏈接標簽 HTML Br換行標簽介紹 HTML P段落標簽介紹 HTML br與p標簽區別 Html H 標題標簽 html px em pt長度單位 HTML B 加粗標簽 HTML stro
  • 在很多現實的場景中,有的文本框我們希望在選擇“是”的按鈕之後才出現,這就需要js控制TR的隱藏和顯示,如何控制,本文為大家揭曉 下文分享的一段代碼:選擇是的按鈕就顯示身高和體重的文本框的代碼。註意:ready方法必須要引用jquery的庫。 1.html Code <html> <head> <me
  • 看到網上很多展示html5雪花飛動的效果,確實非常引人入勝,我相信大家也跟我一樣看著心動的同時,也很好奇,想研究下代碼如何實現;雖然哦很多地方也能下載這些源碼,不過也不知道別人製作此類動畫時的思路及難點分析。 我這幾天剛好學習了一下,也趁著此刻有時間從需求分析、知識點、程式編寫一步步給大家解剖下。
  • 1. css屬性命名區分大小寫嗎? 不區分,不過一般小寫,便於理解 2. margin-top和margin-bottom對於行內(內斂inline)元素效果一樣麽? 3.padding-top和padding-bottom對於inline元素都會增加元素本身的大小麽? 回答2,3,需要瞭解html...
  • 我們知道任何一個自定義函數都是Function構造器的實例,所以我們可以通過new Function的方式來創建函數,使用語法很簡單, new Function(形參1, 形參2, ..., 形參N, 函數體) 註意,裡面的參數全部是以字元串的形式呈現。比如一個簡單的例子——要求寫一個函數, 求兩個
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...