4.1 變量 作用域 內存問題

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

複製變量值:
基本類型的複製:複製的是值

var num1 = 5;
var num2 = num1;

在這裏插入圖片描述
引用型變量的複製:複製的是引用,改變其中一個變量,就會影響另一個變量

var obj1 = new Object();
var obj2 = obj1;
obj1.name = "Nicholas";
alert(obj2.name); //"Nicholas"
 

在這裏插入圖片描述

改變其中一個變量,就會影響另一個變量:例如

var person = new Object();
person.name = "tyt";
var person2 = person;
console.log(person.name); //tyt
console.log(person2.name);  //tyt
person2.name = "TYT";
console.log(person.name); //TYT
console.log(person2.name); //TYT

4.1.2傳遞參數
ECMAScript中所有函數的參數都是按值傳遞的,也就說把函數外部的值複製給函數內部的參數,就相當於把值複製給另一個變量。
很多開發人員錯誤地認爲:在局部作用域中修改的對象會在全局作用域中反映出來,就說明
參數是按引用傳遞的。爲了證明對象是按值傳遞的,我們再看一看下面這個經過修改的例子:

function test (obj) {
	obj.name = "tyt";
	alert(obj.name);  //tyt
	obj = new Object();
	obj.name = "TYT";
	alert(obj.name);  //TYT
	alert(person.name);  //tyt
}
var person = new Object();
test(person);
console.log(person.name); //tyt

說明:我個人比較簡單的理解是這樣的:如果object對象是按引用(引用地址)傳遞的,整個過程如下:函數首先傳入一個對象引用地址,把這個引用地址的name指向“tyt”,然後再對這個對象進行重定義,把這個對象的引用地址又指向“TYT”,這樣最後輸出的對象的name應該是“TYT”,但實際卻不是。說明這裏是按值傳遞的,obj = new Object();這裏相當於var obj = new Object();重新定義一個obj變量對象。仔細理解上面的輸出。

4.1.3 對於引用類型的檢測
使用instanceof 操作符
對引用類型的檢測,我們並不是想知道它是對象,而是想知道它是什麼類型的對象,例如

var person = {};
var arr = [];
var reg = /ab/;
console.log(person instanceof Object);//person 是object嗎?true
console.log(arr instanceof Array);// arr是 Array嗎 true
console.log(reg instanceof RegExp);// reg是RegExp嗎  true

4.2.1 執行環境及作用域

每個執行環境都有一個與之關聯的變量對象,環境中定義的所有變量和函數都保存在這個變量對象中。
當代碼在一個環境中執行時,會創建變量對象的一個作用域鏈,作用域鏈的前端始終都是當前執行代碼所在環境的變量對象,如果這個環境是函數,則將其活動對象作爲變量對象,作用域鏈中的下一變量對象來自外部(包含)環境,再下一變量來自下一包含環境,作用域鏈的最後一個變量對象始終是全局執行環境。內部環境可以通過作用域鏈訪問所有的外部環境,但外部環境不可以訪問任何的內部變量和函數。只能向上搜索,不能向下搜索。

4.2.1 延長作用域鏈
這個還是沒看懂,只能暫時先記到這。
主要有兩種方式:這兩個語句都會在作用域鏈的前端添加一個變量對象。
try catch
with語句

4.2.2 沒有塊級作用域
例如:
for (var i=0; i < 10; i++){
doSomething(i);
}
alert(i); //10
i在for循環之後仍然存在。

初始化變量沒有用var聲明時,這個變量將被當做全局變量。
查詢標誌符時,首先查找局部環境,根據作用域鏈向上查找,直到全局環境。

4.3.1垃圾收集

垃圾收集機制原理:找出那些不在繼續使用的變量,然後釋放其所佔的內存。垃圾收集器會按照固定的時間間隔週期性的執行這一操作。
標記清除——谷歌
引用計數——IE

謝謝觀看,走過路過留下您的足跡,希望點個贊,共同進步。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章