淺說(shuō)js變量
更新時(shí)間:2011年05月25日 21:49:51 作者:
JavaScript 是弱類型, 變量可存儲(chǔ)任意類型, 并且運(yùn)行期間類型可變
復(fù)制代碼 代碼如下:
/*
1, 變量類型:
JavaScript 是弱類型, 變量可存儲(chǔ)任意類型, 并且運(yùn)行期間類型可變;
-> 變量可進(jìn)行類型轉(zhuǎn)換;
*/
/*
2, 變量聲明:
*/
var i;
var index;
var i, index;
var i = 0, index = 2;
/*
變量聲明, 無(wú)初始值時(shí), 值為 undefined;
并且 var 聲明的變量, 不能使用 delete 操作符刪除;
重復(fù)聲明為產(chǎn)生覆蓋, 不會(huì)造成錯(cuò)誤;
遺漏聲明, 則會(huì)把變量隱式聲明此變量, 并做為全局變量; (下節(jié)介紹)
*/
/*
3, 變量作用域:
以函數(shù)劃分: 函數(shù)內(nèi)部聲明的變量, 只能運(yùn)行的函數(shù)內(nèi)部, 即局部變量; (閉包仍可引用);
內(nèi)部變量比全局變量?jī)?yōu)先級(jí)別高; ex:
*/
var g = 'global';
function check() {
var g = 'local';
console.log(g); // local
}
check();
/* 變量盡可能都使用 var 聲明 */
/* 沒(méi)有塊級(jí)作用域 */
if (false) {
var test = 2;
function t() {
console.log('t function');
}
}
t(); // t function;
console.log(test); // undefined;
/*
例外:
firefox 會(huì)報(bào)錯(cuò);
t is not defined;
test 值為 undefined;(末聲明和賦值的變量都是 undefined)
*/
/* 變量聲明會(huì)提前掛起 */
function f() {
console.log(test); // undefined
var test = 'test';
console.log(test); // 'test'
}
// 轉(zhuǎn)化為
function f() {
var test;
console.log(test); // 變量?jī)H聲明, 則初始化為 undefined
test = 'test';
console.log(test); // 變量已賦值, 'test'
}
/* 未定義變量和未賦值變量 */
console.log(t); // 直接使用變量 t;
// 注: 直接給變量賦值時(shí), 會(huì)隱式的把變量做為全局對(duì)待;
var t; // 未賦值變量, undefined;
/*
4, 基本類型和引用類型:
Number/boolean/null/undefined/ 基本類型;
Array/Object/Function 引用類型
第五版, 63頁(yè):
無(wú)論將字符串看作是行為與基本類型相似的不可變引用類型,
還是將它看作使用引用類型的內(nèi)部功能實(shí)現(xiàn)的基本類型, 結(jié)果都是一樣的;
即: String 類型表現(xiàn)為 基本類型;
下面實(shí)例說(shuō)明基本類型和引用類型差別:
*/
var a = 3.14;
var b = a;
a = 4;
console.log(a, b); // 4, 3.14;
var a = [1, 2, 3];
var b = a;
a[0] = 99;
console.log(a, b); // 相同; [99, 2, 3];
// 數(shù)組是引用類型, 變量a和b 指向同一塊內(nèi)存地址;
// 變量保存基本類型的實(shí)際值, 而保存引用類型的引用(類指針);
/*
5, 垃圾收集
引用類型是沒(méi)有固定大小的, 比如: Array, 隨時(shí)可以修改 length;
變量并不能直接保存引用的值, 而是被存儲(chǔ)在某個(gè)位置, 變量保存的只是對(duì)此位置的引用.
所以, JavaScript 會(huì)動(dòng)態(tài)分配內(nèi)存來(lái)存儲(chǔ)實(shí)體;
最終要釋放這些內(nèi)存以便再用, 否則會(huì)消耗所有可用內(nèi)存導(dǎo)致系統(tǒng)崩潰;
JavaScript 不要求手動(dòng)釋放內(nèi)存; 它使用一種稱為垃圾收集方法[方法不可見(jiàn)];
它會(huì)把對(duì)不再使用的對(duì)象所占用的內(nèi)存釋放;
*/
var s = 'hello';
var u = s.toUpperCase();
s = u; // 不能再獲取到 'hello' 值;
// 環(huán)境中不再有 'hello' 引用[沒(méi)有變量指向它]
// (是否進(jìn)行回收, 是通過(guò)是否存在賦值決定的)
/*
6, 作為屬性的變量
全局對(duì)象
window, this, Math;
瀏覽器中的:navigator, screen;
局部變量:調(diào)用對(duì)象
調(diào)用對(duì)象
全局變量是特殊的全局對(duì)象的屬性, 那么局部變量被稱為調(diào)用對(duì)象(call object)的屬性;
函數(shù)的參數(shù)和局部變量作為調(diào)用對(duì)象的屬性而存儲(chǔ);
(使用獨(dú)立對(duì)象存儲(chǔ)局部變量使 JavaScript 可防止局部變量覆蓋同名全局變量的值)
JavaScript 的執(zhí)行環(huán)境
JavaScript 解釋器執(zhí)行一個(gè)函數(shù)時(shí), 會(huì)為函數(shù)創(chuàng)建一個(gè)執(zhí)行環(huán)境(execution context);
一個(gè)執(zhí)行環(huán)境就是所有 JavaScript 代碼段執(zhí)行時(shí)所在的環(huán)境.
運(yùn)行不屬性任何函數(shù)的 JavaScript 代碼的環(huán)境使用的就是全局對(duì)象.
所有 JavaScript 函數(shù)都運(yùn)行在 自己獨(dú)有的執(zhí)行環(huán)境中, 并且有自己的調(diào)用對(duì)象, 在調(diào)用對(duì)象中定義了局部變量.
JavaScript 解釋器可在不同的全局執(zhí)行環(huán)境中運(yùn)行腳本, 并且這些環(huán)境不脫節(jié), 彼此可引用;
(window-iframe);
深入理解變量作用域
每個(gè) JavaScript 執(zhí)行環(huán)境都有一個(gè)和它關(guān)聯(lián)在一起的作用域鏈(scope chain);
作用域鏈?zhǔn)且粋€(gè)對(duì)象列表或?qū)ο箧?
當(dāng) JavaScript 代碼需要查詢變量 X 的值時(shí), 它就開(kāi)始查看此鏈上的第一個(gè)對(duì)象;
如果對(duì)象存在一個(gè)名為 x 的屬性, 那么就采用那個(gè)屬性的值.
如果沒(méi)有, JavaScript 會(huì)繼續(xù)查詢鏈中的第二個(gè)對(duì)象.
如果還沒(méi)有找到, 繼續(xù)查詢下一個(gè)對(duì)象. 以此類推...
補(bǔ)充:
f() 作用域 -> 閉包作用域 -> var 變量所在作用域
-> Object 的原型作用域 -> Object 類屬性作用域
-> 頂層作用域(window);
*/
相關(guān)文章
JS匿名函數(shù)和匿名自執(zhí)行函數(shù)概念與用法分析
這篇文章主要介紹了JS匿名函數(shù)和匿名自執(zhí)行函數(shù)概念與用法,結(jié)合實(shí)例形式分析了匿名函數(shù)和匿名自執(zhí)行函數(shù)的概念、功能、應(yīng)用場(chǎng)景及相關(guān)使用技巧,需要的朋友可以參考下2018-03-03Bootstrap時(shí)間選擇器datetimepicker和daterangepicker使用實(shí)例解析
這篇文章主要為大家詳細(xì)解析了Bootstrap時(shí)間選擇器datetimepicker和daterangepicker使用實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09每個(gè) JavaScript 工程師都應(yīng)懂的33個(gè)概念
這個(gè)項(xiàng)目是為了幫助開(kāi)發(fā)者掌握 JavaScript 概念而創(chuàng)立的。它不是必備,但在未來(lái)學(xué)習(xí)( JavaScript )中,可以作為一篇指南,需要的朋友可以參考下2018-10-10JavaScript canvas實(shí)現(xiàn)流星特效
這篇文章主要為大家詳細(xì)介紹了JavaScript canvas實(shí)現(xiàn)流星特效,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-05-05js控制文本框只能輸入中文、英文、數(shù)字與指定特殊符號(hào)的實(shí)現(xiàn)代碼
下面小編就為大家?guī)?lái)一篇js控制文本框只能輸入中文、英文、數(shù)字與指定特殊符號(hào)的實(shí)現(xiàn)代碼。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-09-09