首頁 > web前端 > js教程 > javascript 顯示全域變數與隱式全域變數的差異

javascript 顯示全域變數與隱式全域變數的差異

高洛峰
發布: 2017-02-11 15:50:48
原創
1043 人瀏覽過

這篇文章主要介紹了javascript 顯示全域變數與隱式全域變數的差異,需要的朋友可以參考下

在JavaScript中,全域變數有兩種宣告方式

  • 使用var 顯示宣告的全域變數

  • 不使用var 宣告的隱式全域變數

兩者的差別在於是否能透過delete 運算元刪除

先看一段程式碼

var a = 'a'; // 显式声明的全局变量
b = 'b'; // 隐式声明的全局变量
 
console.log(a); // a
console.log(b); // b
console.log(window.a); // a
console.log(window.b); // b
登入後複製
(window)的屬性,因此兩種方式宣告的全域變數都可以透過window 拿到

嘗試用delete 刪除

// 显式声明的全局变量不能被删除
delete a; // 返回 false 
 
// 隐式声明的全局变量可以被删除
delete b; // 返回 true 
 
// 删除情况
console.log(typeof a); // string
console.log(typeof b); // undefined
登入後複製

delete 運算符可以刪除一個物件的屬性,但如果屬性是物件的屬性,但如果屬性是物件的屬性不可配置(non-configurable)屬性,刪除時則會傳回false(嚴格模式下會拋出異常)

這表示使用var 宣告的變數是不可設定的,使用getOwnPropertyDescriptor 來取得描述屬性特性的物件來驗證這點

Object.getOwnPropertyDescriptor(window, a); // {value: "a", writable: true, enumerable: true, configurable: false}
Object.getOwnPropertyDescriptor(window, b); // {value: "b", writable: true, enumerable: true, configurable: true}
登入後複製

兩者的根本區別在於顯式宣告的變數不可配置,不能透過delete 運算子刪除

需要注意的是configurable 值一旦為false,描述屬性特性的物件就不能被修改,因此不能透過修改屬性描述符使得顯示宣告的全域變數能被delete 刪除,但反過來,可以使隱式宣告的全域變數也不能被delete 刪除

b = 'b';
var descriptor = Object.getOwnPropertyDescriptor(window, b);
descriptor.configurable = false;
Object.defineProperty(window, b, descriptor);
delete b; // 返回 false
登入後複製

以下是其他網友的補充

// 定义三个全局变量
var global_var = 1;
global_novar = 2; // 反面教材
(function () {
  global_fromfunc = 3; // 反面教材
}());
 
// 试图删除
delete global_var; // false
delete global_novar; // true
delete global_fromfunc; // true
 
// 测试该删除
typeof global_var; // "number"
typeof global_novar; // "undefined"
typeof global_fromfunc; // "undefined"
登入後複製

以下是其他網友的補充

JavaScript之全域變數和隱式全域變數

隱式全域變數和明確定義的全域變數間有些小的差異,就是透過delete運算子讓變數未定義的能力。


1、透過var建立的全域變數(在任何函數以外的程式中建立)是不能被刪除的。

2、無var創建的隱式全域變數(無視是否在函數中創建)是能被刪除的。

這表明,在技術上,隱式全域變數並不是真正的全域變量,但它們是全域物件的屬性。屬性是可以透過delete運算子刪除的,而變數是不能的:

var global = (function () {
  return this;
}());
登入後複製

在瀏覽器中,全域物件可以透過window屬性在程式碼的任何位置存取(除非你做了些比較出格的事情,像是宣告了一個名為window的局部變數)。但是在其他環境下,這個方便的屬性可能被叫做其他什麼東西(甚至在程式中不可用)。如果你需要在沒有硬編碼的window標識符下存取全域對象,你可以在任何層級的函數作用域中做以下操作:

rrreee

這種方法可以隨時獲得全域對象,因為其在函數中被當做函數呼叫了(不是透過new構造),this總是指向全域物件。實際上這個病不適用於ECMAScript 5嚴格模式,所以,在嚴格模式下時,你必須採取不同的形式。例如,你正在開發一個JavaScript庫,你可以將你的程式碼包裹在一個即時函數中,然後從 全域作用域中,傳遞一個引用指向this作為你即時函數的參數。

以上就是javascript 顯示全域變數與隱式全域變數的差別,兩者的根本差別在於明確宣告的變數不可配置,不能透過delete 運算子刪除

更多javascript 顯示全域變數與隱式全域變數的區別相關文章請關注PHP中文網! 🎜
相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板