① 怎麼用javascript訪問C++創建的共享內存
放棄吧,js是沒有這個許可權的,除非你發現了某個瀏覽器漏洞
② javascript 中不同類型以及不同環境下變數的內存都是何時釋放
一.基本類型和引用類型的值
javascript中的變數包含兩種不同數據類型的:基本類型值和引用類型值。基本類型值指的是簡單的數據段,而引用類型值指那些可能右多個值構成的對象。
1.動態的屬性
定義基本類型值和引用類型值的方式是類似的:創建一個變數並為該變數賦值。但是,當這個值保存到變數中以後,對不同類型值可以執行的操作則大相徑庭。
對於引用類型的值,我們可以為其添加屬性和方法,也可以改變和刪除其屬性和方法:
var person = new Object();
person.name = "Nicholas";
alert(person.name);// 「Nicholas」
基本類型值不能動態添加:
var name = "Nicholas";
name.age = 27;
alert(name.age);// undefined
2.復制變數值
復制變數值時兩種類型也會有所不同。
基本類型:
重新在內存中開辟一段空間,賦值前後的兩者相互獨立
引用類型:
雖然也會重新開辟一段空間,但其接受到的值實際上是一個指針,而這個指針指向存儲在堆中的一個對象。賦值操作結束後,兩個變數實際上將引用同一個對象。
3.傳遞參數
javascript中所有函數的參數都是按值傳遞的。基本類型值的傳遞如同基本類型變數的復制一樣,而引用類型的值的傳遞,則如同引用類型變數的復制一樣。
在向參數傳遞引用類型的值時,會把這個值在內存中的地址復制給一個局部變數,因此這個局部變數的變化會反映在函數的外部,情況下面例子:
function addTen(num){
num += 10;
return num;
}
var count = 20;
var result = addTen(count);
alert(count);// 20,沒有變化
alert(result);// 30
引用傳遞:
function setName(obj){
obj.name = "Nicholas";
}
var person = new Object();
setName(person);
alert(person.name);// "Nicholas"
證明對象是按值傳遞的例子:
function setName(obj){
obj.name = "Nicholas";
obj = new Object();
obj.name = "Greg";
}
var person = new Object();
setName(person);
alert(person.name);// "Nicholas"
4.檢測類型
在檢測基本類型時typeof是非常得力的助手,但在檢測引用類型的值時,這個操作符的用處不大。通常,我們並不是想知道某個值是對象,而是想知道它是什麼類型的對象。為此,javascript提供了instanceof操作符,其語法如下:
result = variable instanceof constructor
alert(person instanceof Object);// 變數person是Object嗎?
alert(colors instanceof Array);// 變數colors是Array嗎?
alert(pattern instanceof RegExp);// 變數parrern是RegExp嗎
二.執行環境和作用域
執行環境是javascript中最為重要的一個概念。執行環境定義了變數或函數有權訪問的其他數據,決定了它們各自的行為。每個執行環境都有一個與之關聯的變數對象,環境中定義的所有變數和函數都保存在這個對象中。
每個函數都有自己的執行環境。當執行流進入一個函數時,函數的執行環境就會被推入一個環境棧中。而在函數執行之後,棧將其環境彈出,把控制權返回給之前的執行環境。Javascript中的執行流正式右這個方便的機制控制著。
當代碼在一個環境中執行時,會創建變數對象的一個作用域鏈。作用域鏈的用途是保證對執行環境有權訪問的所有變數和函數的有序訪問。作用域鏈的前端,始終都是當前執行的代碼所在環境的變數對象。如果這個環境是函數,則將其活動對象作為變數對象。活動對象最開始只包含一個變數,即arguments對象。作用域鏈中的下一個變數對象來自包含(外部)環境,直至全局執行環境的變數對象
1.延長作用域鏈
雖然執行環境的類型總共只有兩種——全局和局部(函數),但是可以延長作用域鏈。因為有些語句可以在作用域鏈的前端臨時增加一個變數對象,該變數對象在執行代碼後被移除:
try-catch語句的catch快
with語句
2.沒有塊級作用域
先看如下例子:
if (true){
var color = "blue";
}
alert(color);// "blue"
for (var i = 0; i < 10; ++i){
doSomething(i);
}
alert(i); // 10
使用var聲明的變數會自動被添加到最接近的環境中。在函數內部,最接近的環境就是函數的局部環境;在with語句中,最接近的環境是函數環境。如果初始化變數時沒有使用var聲明,該變數會被添加到全局變數
3.垃圾收集
1.收集方式
標記清除、引用清除
2.性能問題(臨界值)
3.管理內存(不用的數據即使設置為null)
四.總結
javascript變數可以用來保存兩種類型的值:基本類型值和引用類型值。基本類型的值源自以下5種基本類型數據:Undefined、Null、Boolean、Number和String。基本類型值和引用類型值具有以下特點:
基本類型值在內存中占據固定大小的空間,因此被保存在棧內存中
從一個變數向另一個變數復制基本類型的值,會創建這個值的一個副本
引用類型的值是對象,保存在堆內存中
包含引用類型值的變數實際上包含的並不是對象本身,而是一個指向該對象的指針
從一個變數向另一個變數復制引用類型的值,賦值的其實是指針,因此兩個變數最終都指向同一個對象
確定一個值是哪種基本類型可以使用typeof操作符,而確定一個值是哪種引用類型可以使用instanceof操作符
所有變數(包括基本類型和引用類型)都存在於一個執行環境(也稱為作用域)當中,這個執行環境決定了變數的聲明周期,以及哪一部分代碼可以訪問其中的變數。以下是關於執行環境的幾點總結:
執行環境有全局執行環境(也成為全局環境)和函數執行環境之分
每次進入一個新執行環境,都會創建一個用於搜索變數和函數的作用域鏈
函數的局部環境不僅有權訪問函數作用域中的變數,而且有權訪問其包含(父)環境,乃至全局環境
全局環境只能訪問在全景環境中定義的變數和函數,而不能直接訪問局部環境中的任何數據
變數的執行環境有助於確定應該合適釋放環境
javascript是一門具有自動垃圾收集機制的編程語言,開發人員不必關心內存分配和回收問題。可以對Javascript的垃圾收集常式作如下總結:
離開作用域的值將被自動標記為可以回收,因此將在垃圾收集期間被刪除
「標記清除」是目前主流的垃圾收集演算法,這種演算法的思想是給當前不實用的值加上標記,然後再回收其內存
另一種垃圾收集演算法是「引用計數「,這種演算法的思想是跟蹤記錄所有值被引用的次數。Javascript引擎不淺不再使用這種演算法;但在IE中訪問非原聲JavaScript對象(如DOM對象)時,這種演算法仍然可能導致問題
當代碼中存在循環引用現象時,「引用技術」演算法就會導致問題
解除變數的引用不僅有助於消除循環引用現象,而且對垃圾收集也有好處。為了確保有效地回收內存,應該及時接觸不再使用的全局對象、全局對象屬性以及循環引用變數的引用
③ javascript內存方面的問題,高手來啊
肯定還是放在棧中的,你的例子是說對象的屬性石放棧中,而你下面的那個還是對象的屬性放那裡的問題,只不過這個對象是另一個對象的屬性而已。
我具個例子,你定義的全局對象obj.其實可以window.obj和你直接寫obj訪問是一樣的。
④ javascript讀取內存中請求體內容,並且能console.log()出來該怎麼實現
你想查看post請求的請求體中的內容,控制台的console.log是不行的,這樣只能看到DOM結構的數據,如果想看到實體數據,需要切換到「Network」選項(這里以Chrome瀏覽器為例),點擊post的請求文件,則右側會出現請求實體內容:
⑤ JavaScript中如何把頁面中的圖片存入內存或cookie中,以便下一次訪問相同頁面的時候本地
圖片是不能存入cookie的~cookie只能存一些代碼或者文本之類的東西,至於內存的話就別想了,瀏覽器沒給你這個許可權,不過瀏覽器都有緩存的啊~打開之後都會把東西存入緩存,這個你就不用擔心了~然後再一個就是新的瀏覽器(IE9以上)都有前端緩存,可以參考一下~