javascript高級(jí)教程技術(shù)之第四章 變量 作用域和內(nèi)存問題

4.1 基本類型和引用類型的值

ECMAScript變量包括: 基本類型值和應(yīng)用型類型

基本類型:簡單數(shù)據(jù)段 string null number undefined Boolean
引用類型: 多個(gè)值構(gòu)成的對(duì)象 function Array Object...

4.1.1 動(dòng)態(tài)屬性

  • 基本類型動(dòng)態(tài)賦值
var name = 'Nicholas';
name.age = '24'; // undefined
// 不能給基本類型動(dòng)態(tài)賦值
  • 引用類型動(dòng)態(tài)賦值
var person = new Object()
person.name = 'Nicholas'; // Nicholas
// 
如果該person對(duì)象不銷毀的話,該name屬性將一直存在

這說明只能給引用類型值動(dòng)態(tài)賦值,以便將來使用


4.1.2復(fù)制變量值

  • 基本類型變量值
var num1 = 5;
var num2 = num1;
// num1和num2兩者的值是相互不影響的 
// num2 = 3 也不會(huì)影響到num1的值的
  • 引用類型變量值
var obj1 = new Object();
var obj2 = obj1;
obj1.name = '28';
alert(obj2.name) // 28
// 其實(shí)obj1和obj2的指針都是同一個(gè)咳短,無論哪個(gè)賦值砰粹,對(duì)象雙方都具備該屬性

引用類型復(fù)制變量值唧躲,該引用該數(shù)據(jù)的值都擁有該屬性


4.1.3 函數(shù)傳遞參數(shù)

ECMAScript所有參數(shù)都是按值傳遞
JS的基本類型,是按值傳遞的。

var a = 1;
function foo(x) {
    x = 2;
}
foo(a);
console.log(a); // 仍為1, 未受x = 2賦值所影響

對(duì)象

// 列子1
var obj = {x : 1};
function foo(o) {
    o.x = 3;
}
foo(obj);
console.log(obj.x); // 3, 被修改了!
// 因?yàn)橹挥袀€(gè)obj對(duì)象

// 列子2
function quoteFn(obj){
    var o = new Object();
    obj = o;
    obj.name = "tony";
    obj.age = 24;
    obj.sex = "Men";
}
 
var person = {
    name : "miracle",
    age : 12
}
quoteFn(person);
console.log(person.name); // miracle
console.log(person.age); // 12
console.log(person.sex); // undefined
// 函數(shù)內(nèi)創(chuàng)建了局部引用類型弄痹,并不用引用傳遞出去給全局的饭入,所有函數(shù)都是按值傳遞

quoteFn函數(shù)中穿件了一個(gè)局部對(duì)象o肛真,并將其復(fù)制給了參數(shù)obj,然后添加了新的幾個(gè)屬性乾忱。最后我們打印person.name 發(fā)現(xiàn)屬性沒有改變历极。如果是按引用傳遞,那么person應(yīng)該指向新的對(duì)象啊执解。

不懂可以再看著例子
JavaScript 是按值傳遞還是按引用傳遞的
JS中的值是按值傳遞,還是按引用傳遞呢新蟆?


4.1.4 檢查類型

  • typeof
  • instanceof
  • Object.prototype.toString.call(Array)
typeof
 typeof   2               //  輸出   number
 typeof   null           //輸出   object
 typeof   { }             //輸出   object
 typeof   [ ]                //輸出   objecttypeof   (function(){})   輸出  function
 typeof   undefined         //輸出  undefined
 typeof   '222'                 //輸出    string
 typeof  true                  // 輸出     boolean      
instanceof
person instanceof Object         // false/ture
person instanceof Array           // false/ture
person instanceof RegExp      // false/ture
Object.prototype.toString.call
var   gettype=Object.prototype.toString
gettype.call('aaaa')        輸出      [object String]
gettype.call(2222)         輸出      [object Number]
gettype.call(true)          輸出      [object Boolean]
gettype.call(undefined)  輸出      [object Undefined]
gettype.call(null)                  輸出   [object Null]
gettype.call({})                   輸出   [object Object]
gettype.call([])                    輸出   [object Array]
gettype.call(function(){})     輸出   [object Function]

4.2 執(zhí)行環(huán)境及作用域

何為作用域右蕊,在我看來,作用域便是該函數(shù)的活動(dòng)空間帕翻,在此空間里萝风,我可以訪問比我大的空間(全局),但我不允許別人訪問我规惰。簡稱:‘環(huán)境’,也就是執(zhí)行環(huán)境;

執(zhí)行環(huán)境定義了變量或者函數(shù)有權(quán)訪問其他數(shù)據(jù)揩晴,決定了他們各自的行為贪磺。

環(huán)境變量 可以一層一層的向上進(jìn)行追溯 可以訪問它的上級(jí) 環(huán)境(變量和函數(shù))

每個(gè)執(zhí)行環(huán)境都有一個(gè)與之相關(guān)聯(lián)的變量對(duì)象

window全局執(zhí)行環(huán)境是最外圍的一個(gè)執(zhí)行環(huán)境,某個(gè)執(zhí)行環(huán)境中所有代碼執(zhí)行完后該環(huán)境也就被銷毀了寒锚,保存在改環(huán)境中的所有變量也隨之銷毀(瀏覽器關(guān)閉呻粹,window執(zhí)行環(huán)境也就銷毀了)

每個(gè)函數(shù)都有自己的執(zhí)行環(huán)境苏研,當(dāng)執(zhí)行了一個(gè)函數(shù),該環(huán)境也會(huì)進(jìn)入一個(gè)環(huán)境棧中筹燕,執(zhí)行之后衅鹿,棧將其推出,把控制權(quán)還給之前的執(zhí)行環(huán)境

當(dāng)我們一個(gè)函數(shù)執(zhí)行時(shí)大渤,這時(shí)候就會(huì)創(chuàng)建對(duì)象的一個(gè) 作用域, 是用來保證對(duì)執(zhí)行環(huán)境有權(quán)訪問的所有變量和函數(shù)的有序訪問

function DoSomething()
{
  var a; // 注意這一行泵三,定義了一個(gè)變量 a 但是不賦值。
  console.log(a); // 'undefined'
}
var a = 1;
DoSomething(); 

function DoSomething()
{
  console.log(a); // 'undefined'
  var a = 2; // 注意這一行烫幕。
  console.log(a); // 2
}
var a = 1;
DoSomething();

延長作用域

執(zhí)行環(huán)境只有兩種: 全局和局部

  • try-catch語句的catch塊
  • with語句

避免使用該方法

沒有塊級(jí)作用域

在 { } 里面是沒有作用域的, 除非es6的let 就定義了塊級(jí)作用域

聲明變量

在函數(shù)里面如果有var 則該變量為局部變量
如果在函數(shù)里面沒有var 卻給變量賦值磷斧,則該變量為全局變量

function a(b ,c){
  var sum = b + c;
  return sum;
} 
// sum為局部變量
function a(b ,c){
  sum = b + c;
  return sum;
} 
// sum未能var捷犹,則sum在全局會(huì)被 var sum; 變成全局變量
查詢標(biāo)記符

如果該函數(shù)里面沒有該變量,函數(shù)會(huì)一層一層往上找侣颂,直到找到為止翠桦,否則報(bào)錯(cuò)undefined

var color = 'blue';
function getColor() {
  return color;
}
alert(getColor()) // blue;

在該getColor函數(shù)中找不到color變量定義胳蛮,就往上一層找,在全局中找到了color仅炊, 否則報(bào)錯(cuò) undefined

垃圾收集

有興趣的小伙伴可以看這篇文字 js底層數(shù)據(jù)類型
未完待續(xù)...

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末抚垄,一起剝皮案震驚了整個(gè)濱河市谋逻,隨后出現(xiàn)的幾起案子桐经,更是在濱河造成了極大的恐慌,老刑警劉巖阴挣,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件畔咧,死亡現(xiàn)場離奇詭異,居然都是意外死亡誓沸,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門宿百,熙熙樓的掌柜王于貴愁眉苦臉地迎上來洪添,“玉大人,你說我怎么就攤上這事外臂÷烧停” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵罪佳,是天一觀的道長黑低。 經(jīng)常有香客問我赘艳,道長克握,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任掰曾,我火速辦了婚禮停团,結(jié)果婚禮上掏熬,老公的妹妹穿的比我還像新娘秒梅。我一直安慰自己,他們只是感情好岗屏,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開白布漱办。 她就那樣靜靜地躺著,像睡著了一般暇屋。 火紅的嫁衣襯著肌膚如雪洞辣。 梳的紋絲不亂的頭發(fā)上咐刨,一...
    開封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天定鸟,我揣著相機(jī)與錄音著瓶,去河邊找鬼。 笑死材原,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的卷胯。 我是一名探鬼主播威酒,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼担钮!你這毒婦竟也來了佛呻?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤鲤嫡,失蹤者是張志新(化名)和其女友劉穎绑莺,沒想到半個(gè)月后暖眼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體纺裁,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡欺缘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了丧鸯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嫩絮。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖剿干,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情杠步,我是刑警寧澤榜轿,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站差导,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏颠蕴。R本人自食惡果不足惜助析,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望寡键。 院中可真熱鬧雪隧,春花似錦员舵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至溶弟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鸭你,已是汗流浹背我抠。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瓣窄,地道東北人纳鼎。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像贱鄙,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子映九,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容