JavaScript變數和作用域

来源:http://www.cnblogs.com/hlwyfeng/archive/2016/11/19/6080506.html
-Advertisement-
Play Games

認識JavaScript中的變數 JavaScript中的變數有兩種類型,一種是基本類型、一種是引用類型。 + 基本數據類型:Defined,Null,Boolean,Number,String。註意String是屬於基本數據類型,這不同於其他高級語言。 + 引用類型即對象,包括內置對象和自定義對象 ...


認識JavaScript中的變數

JavaScript中的變數有兩種類型,一種是基本類型、一種是引用類型。

  • 基本數據類型:Defined,Null,Boolean,Number,String。註意String是屬於基本數據類型,這不同於其他高級語言。
  • 引用類型即對象,包括內置對象和自定義對象。

需理解的差異

關於複製

對於基本類型的變數,就是我們印象中對於變數的理解。

var a = "TabWeng";
var b = a;
console.log("a:"+a+", b:"+b);
a = "Weng";
console.log("a:"+a+", b:"+b);

運行結果:

a:TabWeng, b:TabWeng
a:Weng, b:TabWeng

我們來看另一個例子:

var a = new Object();
a.name = "TabWeng";
var b = a;
console.log("a'name:"+a.name+", b'name:"+b.name);
a.name = "Weng";
console.log("a'name:"+a.name+", b'name:"+b.name);

運行結果:

a'name:TabWeng, b'name:TabWeng  
a'name:Weng, b'name:Weng

這個結果就不同了,我只修改了 a.name 的值,b.name 的值也跟著發生變化,答案只能是它們的值都指向同一個地方,即它們都指向同一塊記憶體,只要記憶體的值發生變化,因為另一個也指向這個記憶體,自然就獲取了變化後的值。而對於基本類型的變數,也就是我們大家所理解的,在複製後就開闢新的記憶體進行數據存儲,所以兩個變數互不幹擾。

關於傳參

JavaScript的參數傳遞都是按值傳遞

基本類型變數很好理解,但是對於引用類型的變數也許存在疑惑,不要緊,你只要理解下麵這句話即可:
引用類型變數的傳參是按值傳遞,但是訪問引用變數的值時依然是按引用訪問同一個對象。

下麵舉三個例子,對於引用類型,讀者需理解透徹。
第一個例子是基本類型變數的傳參,第二、三是引用類型變數的傳參:

var name = "TabWeng";

function sayFunction(name){
  name = "Hi,"+name;
  console.log(name);
}

sayFunction(name); 
console.log(name);

運行結果:

Hi,TabWeng
TabWeng
var Person = new Object();
Person.name = "TabWeng";

function sayFunction(obj){
  obj.name = "Hi," + obj.name;
  console.log(obj.name);
}

sayFunction(Person);
console.log(Person.name);

運行結果:

Hi,TabWeng
Hi,TabWeng

雖然是按值傳遞,但是在訪問的時候是按引用訪問同一個對象,所以Person.name也改變了。

var Person = new Object();
Person.name = "TabWeng";

function sayFunction(obj){
  obj.name = "Hi," + obj.name;
  console.log(obj.name);
  obj = new Object();
  obj.name = "My name is Tom, I am go to another memory";
  console.log(obj.name);
}

sayFunction(Person);
console.log(Person.name);

運行結果:

Hi,TabWeng
My name is Tom, I am go to another memory
Hi,TabWeng

這個例子說明瞭不是按引用傳遞,否則第三行的結果應該是My name is Tom, I am go to another memory

作用域

作用域鏈

作用域鏈很好理解,一句話概括變數在作用域中的訪問許可權:
外面不能訪問裡面,裡面可以訪問外面,在搜索變數時,從裡向外搜索。

作用域鏈是在創建函數的時候產生的,在創建函數的時候,會創建它的執行環境和作用域鏈,一開始的時候,會創建一個包含全局環境(全局對象)的作用域鏈,然後把該函數的活動對象推入到作用域鏈的前端(也就是裡面,最下麵),如果函數裡面還有函數,那麼再依次推入,這樣就形成一條作用域鏈。

假設作用域鏈(實際上是一張列表)裡面有三個指針指向三個對象,列表最上面的指針指向全局對象(假設稱為obj_1),中間的指針指向活動對象(假設稱為obj_2),下麵的指針指向最前端的活動對象(假設稱為obj_3)。那麼,當前的活動對象的變數是無法訪問下麵指針的活動對象的,即obj_2無法訪問obj_3的變數,反之就可以。

延長作用域鏈

  • try catch
  • with
    以上兩者可延長作用域鏈,把變數放在作用域前端(即當前環境)。

沒有塊級作用域

for(var i = 0; i < 3; i++){
  console.log("in i: "+i);
}

console.log("out i:"+i);

運行結果:

in i: 0  
in i: 1  
in i: 2  
out i:3

這與其他高級不同。

參考

  • 《JavaScript高級程式設計》

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

-Advertisement-
Play Games
更多相關文章
  • (一) 下邊使用outputStream位元組輸出流進行寫操作 package zdbIO;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.I ...
  • 6 類型推測 java編譯器能夠檢查所有的方法調用和對應的聲明來決定類型的實參,即類型推測,類型的推測演算法推測滿足所有參數的最具體類型,如下例所示: 6.1 泛型方法的類型推測 類型的推測可以使泛型方法的使用語法和普通的方法一樣,不必指定尖括弧內的類型,如上述例子。 6.2 泛型類的類型推測 對於泛 ...
  • 複習一下: 1.先創建一個properties配置文件 2.載入讀取配置文件 import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.s ...
  • 一切偉大的行動和思想,都有一個微不足道的開始! ...
  • 1、列偏移與列排序: ①列偏移:控制列出現的位置,某列偏移後,後序列會隨之偏移——只能右偏移; col-lg/md/sm/xs-offset-*; ②列排序:控制某一列的位置,該列可以左(pull)右(push)調整,其排序後,其它列不受影響; col-lg/md/sm/xs-push-*:右移; ...
  • js元素綁定事件 想給一個元素綁定一個方法之後,在綁定一個方法而且不被覆蓋 window.onload = function () { alert('a'); } window.onlaod=function(){ alert('b') } 我們發現它只彈出一個,有一個被覆蓋了 下麵就說一下js中的 ...
  • 在JavaScript中,RegExp對象表示正則表達式,用來對字元串進行匹配。 一、兩種定義方法: 1、直接量法: /pattern/attribute 2、對象法: new RegExp(pattern,attribute); 參數說明: pattern是一個字元串,指定了正則表達式的模式或其他 ...
  • 一:child_process child_process是NodeJs的重要模塊。幫助我們創建多進程任務,更好的利用了電腦的多核性能。 當然也支持線程間的通信。 二:child_process的幾個API 非同步: child_process.exec(command[, options][, c ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...