javascript 顯示全局變量與隱式全局變量的區(qū)別
在JavaScript中,全局變量有兩種聲明方式
-
使用 var 顯示聲明的全局變量
-
不使用 var 聲明的隱式全局變量
兩者的區(qū)別在于是否能通過 delete 操作符刪除
先看一段代碼
var a = 'a'; // 顯式聲明的全局變量 b = 'b'; // 隱式聲明的全局變量 console.log(a); // a console.log(b); // b console.log(window.a); // a console.log(window.b); // b
在 js 中全局變量其實是global對象(window)的屬性,因此兩種方式聲明的全局變量都可以通過 window 拿到
嘗試用 delete 刪除
// 顯式聲明的全局變量不能被刪除 delete a; // 返回 false // 隱式聲明的全局變量可以被刪除 delete b; // 返回 true // 刪除情況 console.log(typeof a); // string console.log(typeof b); // undefined
delete 操作符可以刪除一個對象的屬性,但如果屬性是一個不可配置(non-configurable)屬性,刪除時則會返回 false(嚴(yán)格模式下會拋出異常)
這就表示使用 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}
兩者的根本區(qū)別在于顯式聲明的變量不可配置,不能通過 delete 操作符刪除
需要注意的是 configurable 值一旦為 false,描述屬性特性的對象就不能被修改,因此不能通過修改屬性描述符使得顯示聲明的全局變量能被 delete 刪除,但反過來,可以使隱式聲明的全局變量也不能被 delete 刪除
b = 'b'; var descriptor = Object.getOwnPropertyDescriptor(window, b); descriptor.configurable = false; Object.defineProperty(window, b, descriptor); delete b; // 返回 false
以下是其他網(wǎng)友的補充
JavaScript之全局變量和隱式全局變量
隱式全局變量和明確定義的全局變量間有些小的差異,就是通過delete操作符讓變量未定義的能力。
1、通過var創(chuàng)建的全局變量(任何函數(shù)之外的程序中創(chuàng)建)是不能被刪除的。
2、無var創(chuàng)建的隱式全局變量(無視是否在函數(shù)中創(chuàng)建)是能被刪除的。
這表明,在技術(shù)上,隱式全局變量并不是真正的全局變量,但它們是全局對象的屬性。屬性是可以通過delete操作符刪除的,而變量是不能的:
// 定義三個全局變量 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"
在瀏覽器中,全局對象可以通過window屬性在代碼的任何位置訪問(除非你做了些比較出格的事情,像是聲明了一個名為window的局部變量)。但是在其他環(huán)境下,這個方便的屬性可能被叫做其他什么東西(甚至在程序中不可用)。如果你需要在沒有硬編碼的window標(biāo)識符下訪問全局對象,你可以在任何層級的函數(shù)作用域中做如下操作:
var global = (function () { return this; }());
這種方法可以隨時獲得全局對象,因為其在函數(shù)中被當(dāng)做函數(shù)調(diào)用了(不是通過new構(gòu)造),this總 是指向全局對象。實際上這個病不適用于ECMAScript 5嚴(yán)格模式,所以,在嚴(yán)格模式下時,你必須采取不同的形式。例如,你正在開發(fā)一個JavaScript庫,你可以將你的代碼包裹在一個即時函數(shù)中,然后從 全局作用域中,傳遞一個引用指向this作為你即時函數(shù)的參數(shù)。
以上就是javascript 顯示全局變量與隱式全局變量的區(qū)別,兩者的根本區(qū)別在于顯式聲明的變量不可配置,不能通過 delete 操作符刪除,希望大家多關(guān)注腳本之家的其他文章。
- 基于JavaScript實現(xiàn)復(fù)選框的全選和取消全選
- Java中Integer兩種轉(zhuǎn)int方法比較
- java中fastjson生成和解析json數(shù)據(jù)(序列化和反序列化數(shù)據(jù))
- javascript history對象詳解
- java使用FastJson解析Json數(shù)據(jù)
- java根據(jù)ip地址獲取詳細(xì)地域信息的方法
- 基于JavaScript實現(xiàn)本地圖片預(yù)覽
- Java的Jackson庫中復(fù)雜對象集合的幾種簡單轉(zhuǎn)換
- Java中創(chuàng)建對象的5種方式總結(jié)
- java 同步、異步、阻塞和非阻塞分析
- java 獲取一組數(shù)據(jù)中的最大值和最小值
相關(guān)文章
JavaScript中立即執(zhí)行函數(shù)實例詳解
javascript和其他編程語言相比比較隨意,所以javascript代碼中充滿各種奇葩的寫法,有時霧里看花,當(dāng)然,能理解各型各色的寫法也是對javascript語言特性更進(jìn)一步的深入理解。這篇文章主要給大家介紹了關(guān)于JavaScript中立即執(zhí)行函數(shù)的相關(guān)資料,需要的朋友可以參考下。2017-11-11ECharts餅圖顏色設(shè)置的4種方式總結(jié)
這篇文章主要給大家介紹了關(guān)于ECharts餅圖顏色設(shè)置的4種方式,ECharts餅圖的顏色可以通過多種方式進(jìn)行設(shè)置,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-09-09關(guān)于JavaScript的with 語句的使用方法
JavaScript 有個 with 關(guān)鍵字, with 語句的原本用意是為逐級的對象訪問提供命名空間式的速寫方式. 也就是在指定的代碼區(qū)域, 直接通過節(jié)點名稱調(diào)用對象2011-05-05Google (Local) Search API的簡單使用介紹
這篇文章主要介紹了Google (Local) Search API的簡單使用。需要的朋友可以過來參考下,希望對大家有所幫助2013-11-11