變量、作用域和內存題目

基礎範例和援用範例的值

基礎範例值指的是簡樸的數據段;
援用範例值指那些能夠由多個值組成的對象。
不能給基礎範例增加屬性,能夠給援用範例值動態的增加屬性。

基礎範例按值接見,寄存在棧內存中。
援用範例按援用接見,寄存在堆內存中,棧內存中寄存的是它的地點。

複製援用範例,複製的是棧內存中的地點,所以轉變一個變量會影響另一個變量。
不管是棧內存照樣堆內存,複製的都是棧內存中的地點。

通報參數

一切的函數參數都是按值通報的。

function setName(obj){    //這裏將要通報一個援用範例的參數,但不是按援用通報,是按值通報
    obj.name = "lee";
}
var person = new Object();//
setName(person);
alert(person.name);        //打印lee
//js沒有按援用傳參的功用,牢記不能把通報援用參數看成按援用傳參

傳參是部分變量

var box = "Lee";
function setBox = {    //經由過程傳參也是部分變量,作用域在setBox()範圍下
    alert(box);        //打印"red"
}
setBox("red");
alert(box);            //打印"Lee"

檢測範例

typeof只能檢測基礎數據範例
instanceof能檢測援用範例的值
語法:

result = variable instanceof constructor

運用時組織函數首字母須要大寫;
變量和援用範例的值對應返回true,不然返回false
instanceof在檢測基礎範例時,一直返回false.

作用域

全局環境被認為是window對象

作用域鏈

作用域鏈的用處是保證對實行環境的有權接見的一切變量和函數的有序接見。
在統一作用域中能夠相互接見;在差別作用域中,全局環境不能接見部分變量,在部分環境中能夠接見全局變量。
作用域鏈例子:

var box = "Lee";
function setBox(){
    function setColor(){    //setColor()要領作用域在setBox()內
        var b = "kkk";        //b的作用域在setColor()內
        alert(b);            //打印kkk
        return 123;            //返回123
    }
    return setColor();        //挪用setColor(),返回123
}
alert(setBox());            //挪用setBox(),打印123

沒有塊級作用域

iffor語句的花括號沒有作用域的功用。
運用var聲明的變量會動被增加到近來的環境中;
查詢標識符,如今作用域鏈的最前端最先搜刮,逐漸向上級查詢,直到找到婚配的標識符,
在變量查詢中,接見部分變量要比全局變量更快,由於不須要向上搜刮作用域。

渣滓網絡

渣滓網絡器會在運轉的時刻給存儲在內容中的變量加上標記,然後去掉環境中正在運用變量的標記,沒有被去掉標記的標量將被視為預備刪除的變量。

    原文作者:UCCs
    原文地址: https://segmentfault.com/a/1190000014518999
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞