Something About Variable

来源:http://www.cnblogs.com/cleaverlove/archive/2016/06/21/5598882.html
-Advertisement-
Play Games

CONTENT(目錄) 前言 Variable declearation:three rules you can break 1.Don't set var statement in a block 2.Don't set var statement in a loop 3.Set a variab ...


CONTENT(目錄)

    前言

     Variable declearation:three rules you can break

         1.Don't set var statement in a block

         2.Don't set var statement in a loop 

         3.Set a variable corresponding var stamement

    JvaaScript's Variable scope

        Pitfall 1:variable is function-scoped.

        Pitfall  2:they can be capture in closurse.

  

    前言

    最近看的書,怎麼說呢?就不多也不少。本想等技術成熟些,再來寫博客,和大家一起分享,一起進步,互相交朋友。

    但是,突然發現,最初看的知識,如果不一直在腦袋中回憶,好像雲里霧裡,有些知其然不知其所以然的味道。想起要再回顧一下,就又要從一大堆的材料中找到這些知識,效率十分低下,

  心想這麼做也不是長久之計。但又不是高手,只好將這篇放入隨筆記錄,起碼也算是個安身立命之所。

    本人目前還是在校生,算是渣渣,一心想學好技術,這裡便是我的起點了,寫的不好的請大神們輕拍。

    說到變數,我們會想到變數名的命名規則,變數的類型,變數的聲明,變數作用域等.變數的命名規則有匈牙利命名法和大小駝峰法。變數的類型有六種,其中五種原始類型:

  分別是undefined,null,Number,String,Boolean.其他的全是object(對象).這些只要有點編程知識的,基本都懂我們就不多加討論。有興趣的可以私聊我或者自行百度。

  點擊可看大圖。

 

 

  

     變數的聲明和作用域是我們重點要說明的,畢竟和我們學的C/C++,java等還是有些不一樣的。

   Variable declearation:three rules you can break

    Don't set var statement in a block

     不要將var語句放在塊區域中。我們平時所學的Java和c/c++是支持塊作用域的,在變數所聲明和定義的塊區域外,我們無法使用這個變數。

       但是在JS中,卻不是這樣,我們來看下麵的代碼:

1 functions  fn(x,y){
2     if(x>y){
3      var temp = x;
4            x = y;
5            y = temp;
6     }    
7 }

       記住,在JS中,用 var 聲明的變數,存在一個變數提升的問題(hoisted)。就是講變數的聲明提升到函數體的第一行,而賦值語句還是呆在原來的地方。實際效果如下:

 

function fn(x,y){
    var temp;
    if(x>y){
        temp = x;
        x = y;
        y = temp;
    }

}

     

  還有一點需要註意的是你不得不小心使用每個偽塊作用域(pseudo-block-local)的變數一次,如果你再次聲明這個變數,它會保存當前的值。如下:

function fn(x,y){
 
  if(x<0){
    var temp;
    console.log(temp);//undefind
    temp = 3;
    ....
  }
   if(y<0){
      var temp;// declared again
      console.log(temp);//3
      ...
   }
}

fn(-1,-1);

 

    Don't set a var statement in a loop

     不要在迴圈體內聲明變數,原理和不要在塊區域里聲明變數一樣。如下:

functions fn(){

    var temp;//do this    好像說這麼做速度會快些。
    for(var i=0;i<100;i++){
             var temp; //don't do this
             ....
    }
}

  

  另外再扯一個問題。使用var 聲明變數,有時候會產生一些奇怪的現在。比如:

for(var i=0; i<10;i++){
    setTimeout(function(){
          console.log(i);
     },100*i);
}      //輸出的結果是 10個10 具體是怎麼回事我也似懂非懂,會持續關註這個問題

  

  解決的方案是使用立即調用函數表達式(IIFE)來獲取for迴圈每次迴圈時i的值。(看解決的方法,好像是出現了閉包(closure)的問題,但是我實在看不出來!)

for(var i=0;i<100;i++){
   (function (i){
        setTimeout(function(){
            console.log(i);
         }.100*i);
     })(i);
}

  IIFE是immediately-invoked Function expression的簡寫。想瞭解詳情點擊這裡或者這裡

     ES6提供了let關鍵字來聲明變數,let變數只在其代碼塊中生效,也就是塊級作用域。註意一個要點,在代碼塊內,只要是在let聲明前使用變數都是不可用的。這種現象在ES6        稱為“暫時性死區(temporal dead zone)”,簡稱為TDZ

 

    set a variable corresponding a  var statement

  聲明一個變數我們就用一條var語句。

  先看代碼段(1),在函數體頂端我們用一條var語句聲明瞭三個變數並賦值。再看代碼段(2),如果我們不小心漏了一個逗號(comma),在不經意間你就創建了兩個全局變數b和c。

      (註:給沒用var statement 聲明的變數名賦值,會產生全局變數。)  產生這樣的原因是:a=1 沒有標點符號,javascript內部有個機制,會幫你自動加上分號(semicolon)。

   有興趣的同學想瞭解什麼情況下會自動加分號,可自行百度,也可看文章底部鏈接。

   再來看代碼段(3),文章作者是推薦這樣的寫法。原因有3點:

  • 沒有標點符號的問題,如果你不小心遺漏了分號,自動加分號的機制會幫你加上.
  • 更容易去添加或者刪除某條語句,不會有代碼段(2)產生的問題.
  • 縮進很自然。
//(1)
var a=1,
    b=2,
    c=3;

//(2)
var a=1
    b=2,    //全局變數產生
    c=3;

//(3)
var a=1;
var b=2;
var c=3;

 

   JvaaScript's Variable scope

     javascript的變數的作用域。在JS中的變數作用域是真的奇葩。本文主要講兩點:

      陷阱1: 變數的作用域是函數作用域

var  myvar = "global";
function fn(){
/* var myvar */ (1) console.log(myvar);
//undefined if(true){
/* myvar = "local"; */ (2)
var myvar = "local"; } console.log(myvar); //local }
>fn();
undefined
local
>myvar
gloabl

    與前文的不要將var語句放在塊作用域的原理一樣,存在變數的提升.實際效果是註釋(1)(2)的樣子。所以最佳實踐是只在函數體開始的地方使用var。

 

  陷阱2:閉包

functions fn(){
   var  myvar = "abc";
    return function(){
          return myvar;
     };
}
var f=fn();
>f()
abc

   這個算是最簡單的閉包了吧。在函數里還有內層函數,通過返回內層函數將函數的值拋出來。其實要是閉包的結構太複雜,我也看不懂是否是閉包。還需努力。

   需要註意兩個點:

  • 不經意間分享共同的環境
  • 創建一個新的環境

 

  總結:在沒有開始寫以前,感覺很簡單。因為基本的思路已經有了,但是發現真正做起來,還是有難度的。雖然內容不多,可能還有缺陷,可足足花了3天時間。

     (還有課!!!)

  要考慮排版,內容的思路清晰,還有第一次使用博客園的窘境。喜歡英文的同學可以看這篇,內容基本一樣吧,在這篇文章里的第4點references(引用),

  有你們關心的變數作用域,自動加分號機制,還有"strict mode"(嚴格模式),ES5應該都是“sloppy mode”; 傳送門

 


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

-Advertisement-
Play Games
更多相關文章
  • 未採用生僻的jquery特性,能相容jquery1.2.6以上所有版本 實例預覽 引入文件 複製 使用方法 複製 複製 soColorPacke參數 複製 下載 ...
  • 寫的一個XML操作類,包括讀取/插入/修改/刪除。 using System;using System.Data;using System.Configuration;using System.Web;using System.Web.Security;using System.Web.UI;usi ...
  • 最近項目中總是調來調去的介面,理解不深甚是糊塗,遂簡單整理一下也方便今後查用。 【字元串轉換為對象】 parse用於從一個字元串中解析出json對象,如 var str = '{"name":"demo","age":"22"}' 結果: JSON.parse(str) Object age: "2 ...
  • 一、在上下結構的div佈局中,可能出現div覆蓋div,但是內容卻沒有出現覆蓋的現象。看看一個示例 1: <!DOCTYPE html> 2: <html> 3: <head> 4: <title>DIV與DIV覆蓋</title> 5: <meta http-equiv="Content-Type ...
  • <script type="text/javascript"> function getRandom(n,m){ var n=Number(n); //強制轉換成數字 var m=Number(m); if(isNaN(n)||isNaN(m)){ //判斷是否為有效數字 ,其中一個不是有效數字就返 ...
  • 對於javascript程式員來說,發送ajax請求獲取後臺數據然後把數據和模板拼接成字元串渲染回DOM實現無刷新更新頁面這樣的操作可謂是輕車熟路。但眾所周知,ajax有一個不好,就是不能跨域傳輸數據,而跨域傳輸有時候又是必須用到的,比如我們可能需要調用第三方網站提供的某些API來獲取某些信息,提供 ...
  • 恢復內容開始 最近在上海上學的一個高中同學讓我幫忙,幫她做她們的電腦課程大作業。 由於關係不錯我也不好意思拒絕就幫忙做了,因為這個學期剛剛開始接觸HTML5和css,所以製作過程中有很多不懂的,而且由於HTML5是選修課,一星期只有一節,所以做這個花費了比較多的時間,這個網站是我製作的第一個網站, ...
  • 1.popup中添加圖表信息 2.echat以控制項形式添加在map中 3.以marker形式添加在map demo源碼地址:https://github.com/shitao1988/leaflet-echartmarker ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...