js的變量和做用域

JS變量,做用域
屢次:保存數據的容器
變量名:$_字母,數字,數字不能開頭
關鍵字:if for
保留字:class
基本類型的值是不可修改的,引用類型是能夠修改的
基本類型不是修改,而是覆蓋
沒有辦法給基本類型添加屬性
當基本類型調用方法的時候,會去找它的包裝對象web

內存:
棧:有序排列的,分紅每一個小房間,沒有辦法擴建
堆:至關於小別墅,大小是不固定的,能夠本身擴建一些東西
棧內存是固定大小的空間,堆內存是空間不固定的,無序的
基本類型:不能夠修改:保存在棧內存中
引用類型:能夠修改,保存在堆內存中,地址保存在棧內存中,可是數據保存在堆內存中算法

1、基本數據類型:
byte:Java中最小的數據類型,在內存中佔8位(bit),即1個字節,取值範圍-128~127,默認值0
short:短整型,在內存中佔16位,即2個字節,取值範圍-32768~32767,默認值0
int:整型,用於存儲整數,在內在中佔32位,即4個字節,取值範圍-2147483648~2147483647,默認值0
long:長整型,在內存中佔64位,即8個字節-263~263-1,默認值0L
float:浮點型,在內存中佔32位,即4個字節,用於存儲帶小數點的數字(與double的區別在於float類型有效小數點只有6~7位),默認值0
double:雙精度浮點型,用於存儲帶有小數點的數字,在內存中佔64位,即8個字節,默認值0
char:字符型,用於存儲單個字符,佔16位,即2個字節,取值範圍0~65535,默認值爲空
boolean:布爾類型,佔1個字節,用於判斷真或假(僅有兩個值,即true、false),默認值false
2、引用數據類型:
類、接口類型、數組類型、枚舉類型、註解類型。數組

變量相等的比較:
1.基本類型和本類型比較直接==就行了
2.當比較引用類型的時候,比較的是他們的地址
引用類型,只有指向同一個引用才相等瀏覽器

或者使用遍歷/循環函數

複製變量的值:
基本類型的值的複製,兩個值互不干涉
可是引用類型的話因爲是使用地址,因此一個改變另一個也改變code

參數傳遞和類型檢測:
參數傳遞,調用的時候傳進去的參數叫實參
本身在裏面寫的叫形參
對於參數只有按值傳遞對象

檢測:
‘string’
true
undefined
null
[]
{}
function
RegExp
typeof返回類型接口

instanceof:前面的是後面的實例
只能和引用類型連用,不能夠和基本類型生命週期

全局做用域和局部做用域
變量的做用域:
就是變量起做用的區域和範圍
變量在哪一個範圍起做用
1.變量的生命週期
全局變量:全部都走完
函數做用域:只有函數執行時
2.訪問到變量
局部做用域主要指函數做用域內存

var name = ‘Xm’;
function fn(argument){
    var sex=‘male’;
}

name:全局做用域,他在全局均可以訪問到
sex:局部做用域
js中沒有塊級做用域
變量對象:

var name=‘xm’;
function fn(argument){
    var sex =‘male’;
    function fn2(argument){
        var age=18;
    }
}

fn自己是在全局做用域中
可是fn內部是它的局部做用域

name=window.name
fn=window.fn

不存在的屬性不會報錯,只不過會告訴你undefined

做用域鏈

var name=‘xm’;
function fn(){
    var name =‘xh’;
    var sex=‘male’;
    function fn2(){
        var name=‘xhei’;
        var age=18;
    }
}

使用做用域鏈從內到外查找
內層速度優於外層速度
查找變量的方法

延長做用域鏈

with(person){
    …修改內容
}

至關於直接修改了person中的內容,至關於person.什麼什麼

js解析機制:
預解析
1.var變量:undefined
參數看成局步變量
2.函數
3.變量變量同名無所謂
函數變量:函數
函數函數:第二個函數
4.代碼塊有的不解析

在當前做用域下,js在運行以前都會去進行預解析,預解析會把帶有var 和 function 的關鍵字聲明,並在內存中安排好,進行預解析,而後再逐行讀取代碼(注意預解析只會發生在var 定義的變量和function上)。

逐行解析代碼

變量和函數衝突
按照函數走

函數函數衝突,按照後面的走

//examp5
var a=1
function fn(){
    console.log(a)
    a=2
}
fn()
console.log(a)

/**

  • 全局做用域
  • 預解析:
  • 查找函數聲明
  • fn:function fn(){
  • console.log(a)
  • a=2
  • }
  • 查找變量聲明
  • var a=1 => a:undefined
  • 函數內的做用域
  • 預解析:
  • 查找函數參數
  • 查找函數聲明
  • 查找變量聲明
  • 執行階段:
  • fn() => console.log(a) => fn內沒有定義a,就訪問全局的a
  • fn() => a=2
  • console.log(a) => 訪問你全局a
  • 打印結果:
  • 1
  • 2

*/
————————————————

// examp6
var a=1
function fn(a){
    console.log(a)
    a=2
}
fn()
console.log(a)

/**

  • 全局做用域
  • 預解析:
  • 查找函數聲明
  • fn:function fn(a){
  • console.log(a)
  • var a=2
  • }
  • 查找變量聲明
  • var a=1 => a:undefined
  • 函數內的做用域
  • 預解析:
  • 查找函數參數
  • a:undefined
  • 查找函數聲明
  • 查找變量聲明
  • 執行階段:
  • fn() => console.log(a) => 訪問fn內的a,未傳參數
  • console.log(a) => 訪問你全局a
  • 打印結果:
  • undefined
  • 1

*/
————————————————

// examp7
var a=1
function fn(a){
    console.log(a)
    a=2
}
fn(a)
console.log(a)

/**

  • 全局做用域
  • 預解析:
  • 查找函數聲明
  • fn:function fn(a){
  • console.log(a)
  • a=2
  • }
  • 查找變量聲明
  • var a=1 => a:undefined
  • 函數內的做用域
  • 預解析:
  • 查找函數參數
  • a:undefined
  • 查找函數聲明
  • 查找變量聲明
  • 執行階段:
  • fn(a) => console.log(a) => 訪問fn內的變量a,參數a訪問全局變量a,賦值給fn內的變量a
  • console.log(a) => 訪問你全局a
  • 打印結果:
  • 1
  • 1

*/
————————————————

垃圾收集機制
1.離開做用域的值將被記錄爲可回收,將在垃圾收集期間刪除
2.標記清除是目前最主流的垃圾收集算法
3.標記清除就是給不用的值加標記,而後回收其內存
4.引用計數算法可能由於循環引用的的問題而得不到釋放
5.當變量不用的時候,能夠手動接觸

釋放無用的數據,會瘦內存
自動

手動(原理:找出沒用的數據,打上標記,釋放其內存,週期性執行)
標示無用數據的策略:
標記清除:

環境中的變量

引用計數:

跟蹤記錄每一個數據的引用次數,。
好比Netscape
問題:循環引用

IE
JS: DOM

BOM

內存管理
內存管理:web瀏覽器<桌面應用程序
null:解除引用
局部變量離開做用域,自動的解除引用

var arr=[…]:好比這個全局變量一直存在,咱們能夠手動結局它,用=null

相關文章
相關標籤/搜索