1. 程式人生 > 實用技巧 >JS頁面獲取 session 值,作用域和閉包學習筆記

JS頁面獲取 session 值,作用域和閉包學習筆記

本文例項講述了JS頁面獲取 session 值,作用域和閉包。分享給大家供大家參考,具體如下:

Javascript獲取session的值:

var name= "${sessioScope.變數名}";

注意這裡面需要使用 "" 把 El 表示式給括起來,否則就取不到資料。

JSP獲取session的值:

可以直接${sessionScope.變數名},在標籤裡也是一樣。

JSP獲取URL的值:

var name = "<%=request.getParameter("name")%>";//謹記:在""中的表示式‘<%= %>'結尾不能加‘;'號,且只能寫一句。
var id = ${param.id};//也具有同樣的效果,能用在JS類庫中的jQuery語法。

在四大作用域中,每一個作用域的取值方法大同小異,方法與技巧都是一以貫之的。

下面是關於作用域和作用鏈的一些筆記:

作用域(scope):它是指對某一變數和方法具有訪問許可權的程式碼空間,在JS中, 作用域是在函式中維護的。表示變數或函式起作用的區域,指代了它們在什麼樣的上下文中執行,亦即上下文執行環境。Javascript的作用域只有兩種:全域性作用域和本地作用域,本地作用域是按照函式來區分的。

變數作用域

在JavaScript中全域性變數的作用域比較簡單,它的作用域是全域性的,在程式碼的任何地方都是有定義的。然而函式的引數和區域性變數只在函式體內有定義。另外區域性變數的優先順序要高於同名的全域性變數,也就是說當局部變數與全域性變數重名時,區域性變數會覆蓋全域性變數(如下面例子)。

var num = 1;      //宣告一個全域性變數
function func() {
  var num = 2;    //宣告一個區域性變數
  return num;
}
console.log(num);    //輸出:1
console.log(func());  //輸出:2

注:宣告區域性變數時一定要使用var,否則,直譯器會將該變數當做全域性物件window的屬性。關於變數的詳細筆記地址:原生javascript 學習之js變數全面瞭解

函式作用域

在JavaScript中變數的作用域,並非和C、Java等程式語言似得,在變數宣告的程式碼段之外是不可見的,我們通常稱為塊級作用域,然而在JavaScript中使用的是函式作用域(變數在宣告它們的函式體以及這個函式體巢狀的任意函式體都是有定義的)。(如下面的例子)

function func() {
  console.log(num);      //輸出:undefined,而非報錯,因為變數num在整個函式體內都是有定義的
  var num = 1;        //宣告num 在整個函式體func內都有定義
  console.log(num);      //輸出:1
}
func();//呼叫func函式

注:JavaScript的函式作用域是指在在函式內宣告的所有變數在函式體內始終是可見的,也就是說在函式體內變數宣告之前就已經可用了。

作為屬性的變數:

當宣告一個全域性變數的時候,實際上是定義了全域性物件window的一個屬性。

var num = 1;      //宣告全變數num
alert(window.num)    //輸出:1 宣告的全域性變數實際上就是聲明瞭一個window物件的屬性

作用域鏈

在JavaScript中,函式也是物件,實際上,JavaScript裡一切都是物件。函式物件和其它物件一樣,擁有可以通過程式碼訪問的屬性和一系列僅供JavaScript引擎訪問的內部屬性。其中一個內部屬性是[[Scope]],該內部屬性包含了函式被建立的作用域中物件的集合,這個集合被稱為函式的作用域鏈,它決定了哪些資料能被函式訪問。

當一個函式建立後,它實際上儲存一個作用域鏈,並且作用域鏈會被建立此函式的作用域中可訪問的資料物件填充。例如定義下面這樣一個函式:

function func() {
  var num = 1;
  alert(num);
}
func();

在函式func建立時,它的作用域鏈中會填入一個全域性物件,該全域性物件包含了所有全域性變數,如下圖所示(注意:圖片只例舉了全部變數中的一部分):

函式add的作用域將會在執行時用到。例如執行如下程式碼:

執行此函式時會建立一個稱為"執行期上下文(execution context)"(有人稱為執行環境)的內部物件,執行期上下文定義了函式執行時的環境。每個執行期上下文都有自己的作用域鏈,用於識別符號解析,當執行期上下文被建立時,而它的作用域鏈初始化為當前執行函式的[[Scope]]所包含的物件。

  這些值按照它們出現在函式中的順序被複制到執行期上下文的作用域鏈中。它們共同組成了一個新的物件,叫"活動物件(activation object)",該物件包含了函式的所有區域性變數、命名引數、引數集合以及this,然後此物件會被推入作用域鏈的前端,當執行期上下文被銷燬,活動物件也隨之銷燬。新的作用域鏈如下圖所示:

閉包學習筆記:

閉包:在js中的我的理解就是把外部的變數引用到函式內部形成一個完全封閉的函式體;當內部函式在定義它的作用域的外部被引用時,就建立了該內部函式的閉包 ,如果內部函式引用了位於外部函式的變數,當外部函式呼叫完畢後,這些變數在記憶體不會被釋放,因為閉包需要它們。

所以本質上,閉包就是將函式內部和函式外部連線起來的一座橋樑。

用途:閉包可以讀取函式外部的變數,可以讓變數的值始終保持在記憶體中。

使用閉包要注意:

1)由於閉包會使得函式中的變數都被儲存在記憶體中,記憶體消耗很大,所以不能濫用閉包,否則會造成網頁的效能問題,在IE中可能導致記憶體洩露。解決方法是,在退出函式之前,將不使用的區域性變數全部刪除。

2)閉包會在父函式外部,改變父函式內部變數的值。所以,如果你把父函式當作物件(object)使用,把閉包當作它的公用方法(Public Method),把內部變數當作它的私有屬性(private value),這時一定要小心,不要隨便改變父函式內部變數的值。

更多關於JavaScript相關內容感興趣的讀者可檢視本站專題:《javascript面向物件入門教程》、《JavaScript錯誤與除錯技巧總結》、《JavaScript資料結構與演算法技巧總結》、《JavaScript遍歷演算法與技巧總結》及《JavaScript數學運算用法總結》

希望本文所述對大家JavaScript程式設計有所幫助。