国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

javascript 顯示全局變量與隱式全局變量的區別

2019-11-19 17:39:55
字體:
來源:轉載
供稿:網友

在JavaScript中,全局變量有兩種聲明方式

  • 使用 var 顯示聲明的全局變量

  • 不使用 var 聲明的隱式全局變量

兩者的區別在于是否能通過 delete 操作符刪除

先看一段代碼

var a = 'a'; // 顯式聲明的全局變量b = 'b'; // 隱式聲明的全局變量 console.log(a); // aconsole.log(b); // bconsole.log(window.a); // aconsole.log(window.b); // b

在 js 中全局變量其實是global對象(window)的屬性,因此兩種方式聲明的全局變量都可以通過 window 拿到

嘗試用 delete 刪除

// 顯式聲明的全局變量不能被刪除delete a; // 返回 false  // 隱式聲明的全局變量可以被刪除delete b; // 返回 true  // 刪除情況console.log(typeof a); // stringconsole.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 

以下是其他網友的補充

JavaScript之全局變量和隱式全局變量

隱式全局變量和明確定義的全局變量間有些小的差異,就是通過delete操作符讓變量未定義的能力。

1、通過var創建的全局變量(任何函數之外的程序中創建)是不能被刪除的。
2、無var創建的隱式全局變量(無視是否在函數中創建)是能被刪除的。

這表明,在技術上,隱式全局變量并不是真正的全局變量,但它們是全局對象的屬性。屬性是可以通過delete操作符刪除的,而變量是不能的:

// 定義三個全局變量var global_var = 1;global_novar = 2; // 反面教材(function () {  global_fromfunc = 3; // 反面教材}()); // 試圖刪除delete global_var; // falsedelete global_novar; // truedelete global_fromfunc; // true // 測試該刪除typeof global_var; // "number"typeof global_novar; // "undefined"typeof global_fromfunc; // "undefined"

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

var global = (function () {  return this;}());

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

以上就是javascript 顯示全局變量與隱式全局變量的區別,兩者的根本區別在于顯式聲明的變量不可配置,不能通過 delete 操作符刪除,希望大家多關注武林網的其他文章。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 巴彦淖尔市| 陈巴尔虎旗| 林州市| 清镇市| 沭阳县| 房山区| 林西县| 涡阳县| 民乐县| 建瓯市| 利辛县| 庄河市| 项城市| 吉安县| 大冶市| 如皋市| 外汇| 华阴市| 西华县| 稷山县| 志丹县| 溧阳市| 小金县| 太原市| 长垣县| 武功县| 长丰县| 信阳市| 丰顺县| 南郑县| 衡山县| 芦溪县| 新泰市| 启东市| 黔江区| 长葛市| 河源市| 逊克县| 陇西县| 楚雄市| 都匀市|