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
  • 示例項目結構 在 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# ...