首頁 web前端 js教程 跟我學習javascript的全域變數_javascript技巧

跟我學習javascript的全域變數_javascript技巧

May 16, 2016 pm 03:32 PM
javascript 全域變數

一、盡量少用全域物件

全域變數的問題在於,你的JavaScript應用程式和web頁面上的所有程式碼都共享了這些全域變量,他們住在同一個全域命名空間,所以當程式的兩個不同部分定義同名但不同作用的全域變數的時候,命名衝突在所難免。

web頁麵包含不是該頁面開發者所寫的程式碼也是比較常見的,例如:

  • 第三方的JavaScript庫
  • 廣告方的腳本程式碼
  • 第三方使用者追蹤與分析腳本程式碼
  • 不同類型的小組件,標誌和按鈕

比方說,該第三方腳本定義了一個全域變量,叫做result;接著,在你的函數中也定義一個名為result的全域變數。結果就是後面的變數覆蓋前面的,第三方腳本就一下子嗝屁啦!

因為,你不小心,在程式碼的某處修改了全域變量, 會導致依賴全域變數的其它模組出錯。而且出錯原因難調試,難找到。

再者就是,網頁運行肯定用到window對象,瀏覽器引擎又要遍歷一次window的屬性,效能下降。

  • 全域變數是維繫不同模組之間的紐帶,模組之間只能透過全域變數來存取對方提供的功能
  • 能使用局部變數的時候,絕對不要使用全域變數
var i,n,sum//globals
function averageScore(players){
 sum =0;
 for(i = 1, i = player.length; i<n; i++){
  sum += score(players[i]);
 }
 return sum/n;
}

登入後複製

保持這些變數為局部變量,僅將其作為需要使用它們的程式碼的一部分。

function averageScore(players){
var i,n,sum;
 sum =0;
 for(i = 1, i = player.length; i<n; i++){
  sum += score(players[i]);
 }
 return sum/n;
}

登入後複製

在browser中,this關鍵字會指向全域的window物件
JavaScript 的全域命名空間也被揭露為在程式全域作用域中可以存取的全域對象,該物件作為 this 關鍵字的初始值。在 Web 瀏覽器中,全域物件被綁定到全域的 window 變數。新增或修改全域變數會自動更新全域物件。

this.foo; //undefined
foo ="global foo"; //"global foo"
this.foo; //"global foo"

登入後複製

類似地,更新全域物件也會自動更新全域命名空間:

var foo ="global foo";
this.foo; //"global foo"
this.foo ="changed";
foo; //"changed"

登入後複製

兩種用來改變全域物件的方式,透過var關鍵字聲明以及給全域物件設定屬性(透過this關鍵字)

透過全域物件進行針對目前運作環境的特性偵測(Feature Detection),例如在ES5中提供了一個JSON物件用來操作JSON數據,那麼可以透過if(this.JSON)來判斷目前運作環境是否支持JSON

if(!this.JSON){
 this.JSON ={
  parse:...,
  stringify:...
 }
}

登入後複製

二、如何避免全域變數

方法一:只建立一個全域變數。

MYAPP.stooge = {
 "first-name": "Joe",
 "last-name": "Howard"
};

MYAPP.flight = {
 airline: "Oceanic",
 number: 815,
 departure: {
  IATA: "SYD",
  time: "2004-09-22 14:55",
  city: "Sydney"
 },
 arrival: {
  IATA: "LAX",
  time: "2004-09-23 10:42",
  city: "Los Angeles"
 }
};

登入後複製

方法二:使用模組模式

var serial_maker = function ( ) {

// Produce an object that produces unique strings. A
// unique string is made up of two parts: a prefix
// and a sequence number. The object comes with
// methods for setting the prefix and sequence
// number, and a gensym method that produces unique
// strings.

 var prefix = '';
 var seq = 0;
 return {
  set_prefix: function (p) {
   prefix = String(p);
  },
  set_seq: function (s) {
   seq = s;
  },
  gensym: function ( ) {
   var result = prefix + seq;
   seq += 1;
   return result;
  }
 };
}( );

var seqer = serial_maker( );
seqer.set_prefix = 'Q';
seqer.set_seq = 1000;
var unique = seqer.gensym( ); // unique is "Q1000"
登入後複製

所謂模組模式,就是創建一個函數,該函數包括,私有變數和特權對象,特權對象的內容是,利用閉包能存取私有變數的函數,最後傳回特權物件。

首先,方法二,不僅可以當作全域變數用,也可以用在局部宣告全域變數。因為就算你在不知道某個地方修改了seqer,就會立即報錯,因為這是個對象,不是字串。

方法三:零全域變數

零全域變數其實是為了適應一小段封閉程式碼而採取的局部變數處理方式,只適合在一些特殊場景中使用。最常見的是一些不會被其他腳本訪問到的完全獨立的腳本。
使用零全域變數的方式需要採用立即執行函數,用法如下。

( function ( win ) {

 'use strict' ;
 var doc = win.document ;
 //在此定义其他的变量并书写代码
} )

登入後複製

三、意外的全域變數

由於JavaScript的兩個特徵,不自覺地創建出全域變數是出乎意料的容易。首先,你可以甚至不需要宣告就可以使用變數;第二,JavaScript有隱含的全域概念,代表你不宣告的任何變數都會成為一個全域物件屬性。參考下面的程式碼:

function sum(x, y) {
 // 不推荐写法: 隐式全局变量
 result = x + y;
 return result;
}

登入後複製

此段程式碼中的result沒有聲明。程式碼照樣運作正常,但在呼叫函數後你最後的結果就多一個全域命名空間,這可以是一個問題的根源。

經驗法則是始終使用var聲明變量,正如改進版的sum()函數所演示的:

function sum(x, y) {
 var result = x + y;
 return result;
}

登入後複製

另一個建立隱式全域變數的反例就是使用任務鏈進行部分var宣告。下面的片段中,a是本地變量但是b確實全局變量,這可能不是你希望發生的:

// 反例,勿使用
function foo() {
 var a = b = 0;
 // ...
}

登入後複製

此现象发生的原因在于这个从右到左的赋值,首先,是赋值表达式b = 0,此情况下b是未声明的。这个表达式的返回值是0,然后这个0就分配给了通过var定义的这个局部变量a。换句话说,就好比你输入了:

var a = (b = 0);
如果你已经准备好声明变量,使用链分配是比较好的做法,不会产生任何意料之外的全局变量,如:

function foo() {
 var a, b;
 // ... a = b = 0; // 两个均局部变量
}

登入後複製

然而,另外一个避免全局变量的原因是可移植性。如果你想你的代码在不同的环境下(主机下)运行,使用全局变量如履薄冰,因为你会无意中覆盖你最初环境下不存在的主机对象

  总是记得通过var关键字来声明局部变量

 使用lint工具来确保没有隐式声明的全局变量

以上就是对javascript的全局变量介绍,希望对大家的学习有所帮助。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1421
52
Laravel 教程
1315
25
PHP教程
1266
29
C# 教程
1239
24
如何使用WebSocket和JavaScript實現線上語音辨識系統 如何使用WebSocket和JavaScript實現線上語音辨識系統 Dec 17, 2023 pm 02:54 PM

如何使用WebSocket和JavaScript實現線上語音辨識系統引言:隨著科技的不斷發展,語音辨識技術已成為了人工智慧領域的重要組成部分。而基於WebSocket和JavaScript實現的線上語音辨識系統,具備了低延遲、即時性和跨平台的特點,成為了廣泛應用的解決方案。本文將介紹如何使用WebSocket和JavaScript來實現線上語音辨識系

WebSocket與JavaScript:實現即時監控系統的關鍵技術 WebSocket與JavaScript:實現即時監控系統的關鍵技術 Dec 17, 2023 pm 05:30 PM

WebSocket與JavaScript:實現即時監控系統的關鍵技術引言:隨著互聯網技術的快速發展,即時監控系統在各個領域中得到了廣泛的應用。而實現即時監控的關鍵技術之一就是WebSocket與JavaScript的結合使用。本文將介紹WebSocket與JavaScript在即時監控系統中的應用,並給出程式碼範例,詳細解釋其實作原理。一、WebSocket技

C++ 函數的局部變數和全域變數有什麼不同? C++ 函數的局部變數和全域變數有什麼不同? Apr 19, 2024 pm 03:42 PM

C++局部變數和全域變數的差異:可見性:局部變數僅限於定義函數,而全域變數在整個程式中可見。記憶體分配:局部變數在堆疊上分配,而全域變數在全域資料區分配。作用域:局部變數在函數內,而全域變數在整個程式中。初始化:局部變數在函數呼叫時初始化,而全域變數在程式啟動時初始化。重新創建:局部變數在每次函數呼叫時重新創建,而全域變數僅在程式啟動時創建。

如何利用JavaScript和WebSocket實現即時線上點餐系統 如何利用JavaScript和WebSocket實現即時線上點餐系統 Dec 17, 2023 pm 12:09 PM

如何利用JavaScript和WebSocket實現即時線上點餐系統介紹:隨著網路的普及和技術的進步,越來越多的餐廳開始提供線上點餐服務。為了實現即時線上點餐系統,我們可以利用JavaScript和WebSocket技術。 WebSocket是一種基於TCP協定的全雙工通訊協議,可實現客戶端與伺服器的即時雙向通訊。在即時線上點餐系統中,當使用者選擇菜餚並下訂單

如何使用WebSocket和JavaScript實現線上預約系統 如何使用WebSocket和JavaScript實現線上預約系統 Dec 17, 2023 am 09:39 AM

如何使用WebSocket和JavaScript實現線上預約系統在當今數位化的時代,越來越多的業務和服務都需要提供線上預約功能。而實現一個高效、即時的線上預約系統是至關重要的。本文將介紹如何使用WebSocket和JavaScript來實作一個線上預約系統,並提供具體的程式碼範例。一、什麼是WebSocketWebSocket是一種在單一TCP連線上進行全雙工

JavaScript與WebSocket:打造高效率的即時天氣預報系統 JavaScript與WebSocket:打造高效率的即時天氣預報系統 Dec 17, 2023 pm 05:13 PM

JavaScript和WebSocket:打造高效的即時天氣預報系統引言:如今,天氣預報的準確性對於日常生活以及決策制定具有重要意義。隨著技術的發展,我們可以透過即時獲取天氣數據來提供更準確可靠的天氣預報。在本文中,我們將學習如何使用JavaScript和WebSocket技術,來建立一個高效的即時天氣預報系統。本文將透過具體的程式碼範例來展示實現的過程。 We

簡易JavaScript教學:取得HTTP狀態碼的方法 簡易JavaScript教學:取得HTTP狀態碼的方法 Jan 05, 2024 pm 06:08 PM

JavaScript教學:如何取得HTTP狀態碼,需要具體程式碼範例前言:在Web開發中,經常會涉及到與伺服器進行資料互動的場景。在與伺服器進行通訊時,我們經常需要取得傳回的HTTP狀態碼來判斷操作是否成功,並根據不同的狀態碼來進行對應的處理。本篇文章將教你如何使用JavaScript來取得HTTP狀態碼,並提供一些實用的程式碼範例。使用XMLHttpRequest

javascript如何使用insertBefore javascript如何使用insertBefore Nov 24, 2023 am 11:56 AM

用法:在JavaScript中,insertBefore()方法用於在DOM樹中插入一個新的節點。這個方法需要兩個參數:要插入的新節點和參考節點(即新節點將要插入的位置的節點)。

See all articles