js 變數 作用域和記憶體問題

2022-03-09 09:38:06 字數 2814 閱讀 8286

基本型別和引用型別

屬性引用型別可以動態新增屬性,而基本型別不可以

var p = new obj();

p.name = "huyuping";

console.log(p.name)//huyuping

var a;

a.name = "huyuping";

console.log(a,name)//出錯

複製變數值

會在變數的物件上建立了乙個新值,然後把複製到新變數分配的位置上。

下面的我形象化的幫助大家理解

這就相當於a和b都有乙個房子,a把值複製給b後,b的房子了也有了這個值。

當從乙個變數向另乙個變數複製引用型別的值時,同時也會將儲存在變數型別中的複製乙份放到為新變數分配的記憶體空間中。

這可以這樣理解:a,b都有自己的地方,a的值時放在另乙個屋子裡的,a複製給b,那a和b都要在哪個房子裡去拿值,這個房子就是給a分配的記憶體,b的記憶體也指向哪個位置。

傳遞引數

unction addten(num) 

var count = 20;

var result = addten(count);

console.log(count);//20

console.log(result);//30

這裡函式有個區域性變數num,在使用之後就被**了,然後函式返回乙個值。

我們看下面一種情況

function addten(num) 

var count = 20;

addten(count);

console.log(count);//20

console.log(addten(count));//30

這次,我們沒有定義result變數,而是直接輸出addten(count),輸出的值還是30,這更說明了num時區域性變數,不會影響count的值。

function setname(obj) 

var person = new object();

setname(person);

console.log(person.name);//huyuping

在這個函式內部,obj和person引用的時同乙個物件,所以為obj新增name屬性的時候,在外面也有反應。

作用域script:全域性變數、全域性函式

函式:自上而下、由里到外

e.g.1

alert(a);//undefined

var a = 1;

function fn1 ()

fn1();

alert(a);//1

分析:

1.預解析:

1)a= undefined

2)fn1 = function fn1 () (函式裡的a是新定義的,所以預解析的時候會先是var a = undefined)

2.表示式:

1)a=1;

2)呼叫函式

1.預解析 a= undefined

2.表示式 a=3

e.g.2

alert(a);//undefined

var a = 1;

function fn1 ()

fn1();

alert(a);//2

分析:

1.預解析:

1)a= undefined

2)fn1 = function fn1 ()

2.逐行解讀**:

1)a=1;

2)呼叫函式

1.預解析 (沒有預解析,此時返回父級作用域(從子級作用域返回到父級作用域的過程叫作用域鏈)) 找到a=1,改為a=2

e.g.3

alert(a);//undefined

var a = 1;

function fn1 (a)

fn1();

alert(a);//1

分析:

1.預解析:

1)a= undefined

2)fn1 = function fn1 (a)

2.逐行解讀**:

1)a=1;

2)呼叫函式

1.預解析

function fn1 (a) a相當與var a

a=undefined

2.逐行解讀**

a=3

e.g.4

var a = 1;

function fn1 (a)

fn1(a);

alert(a);//1

分析:

1.預解析:

1)a= undefined

2)fn1 = function fn1 (a)

2.逐行解讀**:

1)a=1;

2)呼叫函式

1.預解析 function fn1 (a) a相當與var a

因為fn1(a),相當於對a傳了引數,所以function fn1 (a)相當於function fn1 (var a = 1)

2.逐行解讀**

a=3

if、for 是通透的不是作用域

注意:火狐解析不到if語句裡麵包著的函式體,所以盡量不要向if、for裡面定義變數或函式

JS 變數 作用域和記憶體問題

向引數傳遞基本型別時 把值從乙個變數賦值到另乙個變數 傳遞引用型別時 把這個值在記憶體中的位址賦值給區域性變數 function addten num var count 20 var result addten count console.log count 20,沒有變化 console.log...

JS 變數 作用域和記憶體問題

一 基本型別和引用型別的值 1 5中基本型別 undefined,null,string,boolean,number是按值訪問的,可以操作儲存在變數的實際的值。引用型別的值是儲存在記憶體中的物件,操作物件實際上是操作物件的應用而不是直接操作物件 2 變數複製是將儲存在變數物件的值複製乙份儲存在新變...

變數 作用域和記憶體問題

1.1 動態的屬性 引用型別 var person new object person.name nicholas alert person.name nicholas 基本型別 var name nicholas name.age 27 alert name.age undefined1.2 複製...