javascript 中加’var‘和不加'var'的區別,你真的懂嗎?

来源:http://www.cnblogs.com/painsOnline/archive/2016/01/06/5104534.html
-Advertisement-
Play Games

js全局變數這個問題,其實還很複雜的,大家估計都是看到了錶面現象而已,這篇文章保證讓你茅舍頓開,小學生都能看懂


沒看之前千萬別說我是標題黨,這個問題真的有好多淫都不懂!!!

大家都看了很多文章,都說避免隱式聲明全局變數,就是說聲明變數前必須加'var',那加了'var'和不加'var'到底有啥區別呢?

 先來看一段代碼

var a = 'aa';
alert(a); //彈出 'aa'
alert(window.a)//彈出'aa'

明白了吧,你聲明一個全局變數其實是給'window'對象增加了一個屬性,下麵一段代碼有相同效果

a = 'aa';
alert(a); //彈出 'aa'
alert(window.a)//彈出'aa'

那"var a = 'aa' " 和 "a = 'aa' " 都是全局變數,有啥區別了? 看下麵兩段段代碼

var a = 'aa';
delete window.a; // false
a = 'aa';
delete window.a; // true

都是為'window'對象增加了屬性,一個可以刪除,一個不能刪除。但是加上'var'就可以作用域相關了,不加'var'始終都是在為'window'對象動態添加屬性,以下代碼為證

var test = function(){
 a = 'aa';
}

test();

alert(window.a);//彈出'aa'

 由於window對象是全局對象,因此預設可以不加,下麵這段同樣效果

var test = function(){
 a = 'aa';
}

test();

alert(a);//彈出'aa'

說到這,認真思考的同學現在必然有個疑問, 為啥隱式聲明的全局變數可以刪除,顯式聲明的全局變數就無法刪除?

原因是"delete 不可以刪除那些可配置性為false的屬性" ,某些內置對象的屬性是不可配置的,比如通過變數聲明或者函數聲明創建的全局對象的屬性,以下代碼為證

delete Object.prototype; // false 不可刪除,該屬性是不可配置的
var a = 'aa';
delete window.a;//false 不可刪除,該屬性是不可配置的
function test(){};
delete window.test;//false 不可刪除,該屬性是不可配置的

那這樣不就明白了,通過'var'聲明的全局變數,其實際上是為'window'對象增加了一個不可配置的屬性, 而不加'var'聲明的全局變數,其實際上是為'window'對象增加了一個可以配置的屬性。

註意了,以上使用window的地方,window都可以用this代替,如:

var test = function(){
 a = 'aa';
}

test();

alert(this.a);//彈出'aa'

至於原因,請查看鄙人之前寫的文章 'this,this,再次討論javascript中的this,超全面'

 

鄙人才疏學淺,有不足之處,歡迎補足

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 點擊按鈕添加或者刪除一行實例代碼:網站在填寫表達的時候又很多的選擇空間,甚至可以自行添加需要添加的內容,例如可以點擊按鈕添加一個表達項,如果不需要的話可以點擊一個按鈕刪除,下麵就簡單介紹一下如何實現此效果。代碼實例如下:點擊按鈕添加或者刪除一行-螞蟻部落 ID 用戶名 類型 ...
  • javascript如何將時間日期轉換為Date對象:有時候需要講一個字元串型的時間日期轉換為Date時間對象,下麵就通過一個簡單的實例提供一種解決方案,當然也是一種思路,可以進行一定的變通,以達到舉一反三的效果。例如這裡有一個時間日期字元串:2013-9-15 8:25:30下麵就將它們轉換為時間...
  • 讓input文本框文本垂直居中代碼實例:很多時候講究對稱美,也有時候講究不對稱的美,當然這個要分具體情況,在文本框中一般對稱一些更為美觀,下麵就通過代碼實例介紹如何實現文本框中的文本垂直居中對齊。代碼實例如下:螞蟻部落 以上代碼實現了我們的要求,將height屬性值和line-height屬...
  • 按鈕倒計時可用效果實例代碼:很多網頁都有這樣的效果,那就是按鈕必須在指定的倒計時之後才是可用的,下麵就通過代碼實例介紹一下如何實現此效果。代碼如下:螞蟻部落 以上代碼實現了我們的要求,當點擊按鈕之後,開始倒計時效果,當倒計時完畢按鈕才是可用的。原文地址是:http://www.softwhy.com...
  • javascript的constructor簡單介紹:constructor可以返回對象對創建它的構造函數的引用,例如:var arr=[1,2,3];console.log(arr.constructor===Array);以上代碼中的輸出值是true,這說明數組對象arr的constructor...
  • 子元素的margin-top作用於外層父元素解決方法:有時候在設置子元素的margin-top屬性的時候,本來是要作用於父元素,但是表現的結果卻是父元素具有了margin-top效果,下麵就通過代碼實例介紹一下如何解決此問題。代碼實例如下:螞蟻部落 上面代碼實現了我們的要求,其實這個就是典型的...
  • js淡入淡出效果實例代碼:現在的網頁要求美觀平滑,所以很多讓元素消失的效果也也需要有一個過渡過程,這樣看起來更為平緩美觀,本章節提供了一個代碼實例,可以輕鬆的實現讓元素淡入淡出效果。代碼實例如下:螞蟻部落 以上代碼實現了我們的要求,代碼比較簡單,直接運用的jQuery中的函...
  • 如何點擊一個按鈕實現列印:很多網站在底部都有一個列印按鈕,點擊此按鈕就可以實現列印效果,代碼非常的簡單。螞蟻部落也就是只要調用window.print()函數就可以實現列印當前頁面。但是上面的並不完美,因為有些網頁上的很多內容都不需要列印,下麵介紹一下如何列印頁面中的指定內容。代碼如下:指定被列印的...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...