導航:首頁 > 凈水問答 > 過濾獲取上下文

過濾獲取上下文

發布時間:2022-02-08 03:45:34

① 通過javascript執行鏈獲取上下文對象

一、介紹

本篇繼上一篇深入理解js執行--單線程的JS,這次我們來深入了解js執行過程中的執行上下文。

本篇涉及到的名詞:預執行,執行上下文,變數對象,活動對象,作用域鏈,this等

二、預執行

在上一篇說到,在js代碼被執行,執行上下文會被壓進執行棧中,但是在此之前還有一步工作要做,就是創建好執行上下文,因為創建好才能被壓進去啊。

創建執行上下文就是預執行過程:接下來說說創建執行上下文的細節部分。

三、創建執行上下文

(1)執行上下文組成

執行上下文:也叫一個執行環境,有全局執行環境和函數執行環境兩種。每個執行環境中包含這三部分:變數對象/活動對象,作用域鏈,this的值

代碼模擬

//可以把執行上下文看作一個對象exeContext = {
VO = [...], //VO代表變數對象,保存變數和函數聲明
scopeChain = [...]; //作用域鏈
thisValue = {...}; //this的值}

創建執行上下文就是創建變數對象,作用域鏈和this過程

接下來就分別細說創建變數對象/活動對象,作用域鏈,this值的過程。

(2)變數對象(variable object)

變數對象中存儲了在上下文(環境)中定義的變數和函數聲明

創建變數對象(VO)時就是將各種變數和函數聲明進行提升的環節:

//用下面代碼為例子console.log(a);console.log(b);console.log(c);console.log(d);var a = 100;
b = 10;function c(){};var d = function(){};

上述代碼的變數對象:

//這里用VO表示變數對象VO = {
a = undefined; //有a,a使用var聲明,值會被賦值為undefined
//沒有b,因為b沒用var聲明
c = function c (){} //有c,c是函數聲明,並且c指向該函數
d = undefined; //有d,d用var聲明,值會被賦值為undefined}

解說:執行上述代碼的時候,會創建一個全局執行上下文,上下文中包含上面變數對象,創建完執行上下文後,這個執行上下文才會被壓進執行棧中。開始執行後,因為js代碼一步一步被執行,後面賦值的代碼還沒被執行到,所以使用console.log函數列印各個變數的值是變數對象中的值。

在運行到第二行時會報錯(報錯後就不再執行了),因為沒有b(b is no defined)。把第二行注釋掉後,再執行各個結果就是VO裡面的對應的值。

講到這里我想大家對變數對象理解了吧,以及對變數提升和函數提升有個深入了解。

(3)活動對象(activation object)

活動對象是在函數執行上下文裡面的,其實也是變數對象,只是它需要在函數被調用時才被激活,而且初始化arguments,激活後就是看做變數對象執行上面一樣的步驟。

//例子function fn(name){ var age = 3; console.log(name);
}
fn('ry');

當上面的函數fn被調用,就會創建一個執行上下文,同時活動對象被激活

//活動對象AO = { arguments : {0:'ry'}, //arguments的值初始化為傳入的參數
name : ry, //形參初始化為傳進來的值
age : undefined //var 聲明的age,賦值為undefined}

活動對象其實也是變數對象,做著同樣的工作。其實不管變數還是活動對象,這里都表明了,全局執行和函數執行時都有一個變數對象來儲存著該上下文(環境內)定義的變數和函數。

(4)作用域鏈(scope chain)

在創建執行上下文時還要創建一個重要的東西,就是作用域鏈。每個執行環境的作用域鏈由當前環境的變數對象及父級環境的作用域鏈構成。

創建作用域鏈過程:

//以本段代碼為例function fn(a,b){ var x = 'string',
}
fn(1,2);

1.函數被調用前,初始化function fn,fn有個私有屬性[[scope]],它會被初始化為當前全局的作用域,fn.[[scope]="globalScope"。

2.調用函數fn(1,2),開始創建fn執行上下文,同時創建作用域鏈fn.scopeChain = [fn.[[scope]]],此時作用域鏈中有全局作用域。

3.fn活動對象AO被初始化後,把活動對象作為變數對象推到作用域鏈前端,此時fn.scopeChain = [fn.AO,fn.[[scope]]],構建完成,此時作用域鏈中有兩個值,一個當前活動對象,一個全局作用域。

fn的作用域鏈構建完成,作用域鏈中有兩個值,第一個是fn函數自身的活動對象,能訪問自身的變數,還有一個是全局作用域,所以fn能訪問外部的變數。這里就說明了為什麼函數中能夠訪問函數外部的變數,因為有作用域鏈,在自身找不到就順著作用域鏈往上找。

(5)this的值

上面說過執行上下文有兩種,一個全局執行上下文,一個函數執行上下,下面分別說說這兩種上下文的this。

a.全局執行上下文的this

指向window全局對象

b.函數執行上下文的this(主要講函數的this)

在《JavaScript權威指南》中有這么幾句話:
1.this是關鍵字,不是變數,不是屬性名,js語法不允許給this賦值。
2.關鍵字this沒有作用域限制,嵌套的函數不會從調用它的函數中繼承this。
3.如果嵌套函數作為方法調用,其this指向調用它的對象。
4.如果嵌套函數作為函數調用,其this值是window(非嚴格模式),或undefined(嚴格模式下)。

解讀一下:上面說的概括了this兩種值的情況:
1.函數直接作為某對象的方法被調用則函數的this指向該對象。
2.函數作為函數直接獨立調用(不是某對象的方法),或是函數中的函數,其this指向window。

我們看幾個栗子便可理解:
栗子1:(這個例子我相信都能理解)當函數被獨立運行時,其this的值指向window對象。

function a(){ console.log(this);
}//獨立運行a(); //window

栗子2:(函數中函數,這里嵌套了個外圍函數)這里也是指向window對象,也相當於函數作為函數調用,就是獨立運行。其實這個例子也說明閉包的this指向Window。

//外圍函數function a(){ //b函數在裡面
function b(){ console.log(this);
} //雖然在函數中,但b函數獨立運行,不是那個對象的方法
b();
}
a(); //window

栗子3:(再寫復雜點的話)x函數即使在對象裡面,但它是函數中的函數,也是作為函數運行,不是Object的方法。getName才是objcet的方法,所以getName的this指向object(在下個栗子有)。

//一個對象var object = { //getName是Object的方法
getName : function(){ //x是getName裡面的函數,它是作為函數調用的,this就是window啦
function x(){ console.log(this);
}
x();
}
}
object.getName(); //window

以上三個都是輸出window,下面是this指向某個對象的情況。

栗子4:函數作為某個對象的方法被調用。

//一個對象var object = {
name : "object", //getName是Object的方法
getName : function(){
console.log(this === object);
}
}object.getName(); //true , 說明this指向了object

這里的getName中的this是指向objct對象的,因為getName是object的一個方法,它作為對象方法被調用。

栗子5:再來個栗子。

var name = "window";var obj = {
name : "obj"};function fn (){ console.log(this.name);
}//將fn通過call或bind或apply直接綁定給obj,從而成為obj的方法。fn.call(obj); //obj

再總結一下this的值

全局執行上下文:this的值是window
函數執行上下文:this的值兩種:
1.函數中this指向某對象,因為函數作為對象的方法:怎麼看函數是對象的方法,一種是直接寫在對象裡面(不是嵌套在對象方法中的函數,不懂再看看栗子3),另一種是通過call等方法直接綁定在對象中。

2.函數中this指向window:函數獨立運行,不是對象的方法,函數中的函數(閉包),其this指向window。

四、總結整個js代碼執行過程

(1)JS執行過程

js代碼執行分成了兩部分:預執行和執行

② DRUPAL7 相關文章調用,想通過一個欄位來調用相同內容的文章,請問用上下文過濾器能實現嗎如何實現

安裝 token 模塊, 把 q參數放入URL鏈接里, 然後通過上下來過濾,通過URL鏈接獲取這個參數, 不過這樣URL鏈接會更深一層。

也關注看有沒有更好的解決辦法。

③ static 方法中 如何獲取上下文 android 中 靜態方法中不能使用this當做上下文的對象,怎麼辦

可以在把具體的場景說一下嗎,這樣不太好回答
從現在的提問上來看 你可以直接創一個null
也可以傳一個Context的子類 一般來說
或new一個Context 或者它的子類

④ 過濾器中怎麼獲取web.xml的<context-param>值

現在過濾器裡面定義一個變數

private string xx

然後在congfig裡面接收
xx =config

xx就是的值

⑤ jsp。pagecontext獲取上下文,什麼叫上下文

數據的更新和查詢,都是把數據封裝到一個地方,就一個臨時存儲位置,然後在指定的位置,獲取然後進行業務邏輯操作,你可以理解為它的作用就是用來存儲對象用的

⑥ Javascript如何獲取caller的上下文

除非funA主動傳遞this,否則其他地方無法獲取。所以說如果你想獲取funA,必須要修改,否則你只能在傳遞funB的時候把funB的this綁定為funA所使用的this

⑦ 過濾器中中為什麼不能用request.getcontextpath()

這樣的代碼是在jsp里出現的吧, 那麼他的含義就是為了得到一個路徑,做動態網站時,需要提交form表單在表單的action裡面就會這樣來寫 action="<%=path %>/add.do" 這樣來提交到相應的servlet中去,這樣可以避免路徑的錯誤,而採用這樣的相對路徑會更好些
答:request.getContextPath()應該是得到項目的名字,如果項目為根目錄,則得到一個"",即空的字條串, 如果項目為abc, <%=request.getContextPath()% >/ 將得到abc/,伺服器端的路徑則會自動加上

⑧ aop如何取得上下文的參數和信息

你可以在AOP的類里聲明一個變數,當用戶登陸的時候在Action里你手工的把要存在session里的東西set到這個變數里(當然Action里要注入AOP的那個類)

⑨ java web servlet 上下文對象如何獲得上下文對象有哪些常見的用法

ServletContext,是一個全局的儲存信息的空間,伺服器開始,其就存在,伺服器關閉,其才釋放。request,一個用戶可有多個;session,一個用戶一個;而servletContext,所有用戶共用一個。所以,為了節省空間,提高效率,ServletContext中,要放必須的、重要的、所有用戶需要共享的線程又是安全的一些信息。如,做一個購物類的網站,要從資料庫中提取物品信息,如果用session保存這些物品信息,每個用戶都訪問一便資料庫,效率就太低了;所以要用來Servlet上下文來保存,在伺服器開始時,就訪問資料庫,將物品信息存入Servlet上下文中,這樣,每個用戶只用從上下文中讀入物品信息就行了。

HttpSession session = request.getSession();
session.getServletContext();

⑩ 在過濾器doFilter方法里,怎麼取得Spring的bean

Filter的init方法中暴露了FilterConfig介面,通過該介面可以獲取回ServletContext
FilterConfig.getServletContext().
Spring web容器載入完成後,將在答ServletContext中存放ApplicationContext,以WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE為儲存的Key值,所以,ServletContext.getAttribut(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE)可以獲取ApplicationContext

閱讀全文

與過濾獲取上下文相關的資料

熱點內容
鈍化廢水裡的泡沫怎麼消除 瀏覽:340
污水處理堵塞怎麼清理 瀏覽:351
豆製品污水用哪種絮凝劑好 瀏覽:494
雨排管可以排污水嗎 瀏覽:544
廢水調節池平面尺寸計算 瀏覽:422
用純凈水洗鼻子有什麼好處 瀏覽:513
空氣濾芯大車的多少錢一個 瀏覽:768
凈水機濾芯如何清零 瀏覽:162
船用主機回油可以關閉不 瀏覽:596
嵊新污水處理二期 瀏覽:578
濟南水處理設備廠家 瀏覽:507
小米凈化器怎麼與app連接 瀏覽:554
污水處理資源化經濟化景觀化 瀏覽:908
雨污水蓋板怎麼看出是加重 瀏覽:972
樓盤污水設計 瀏覽:972
長安福特汽油濾芯怎麼拆 瀏覽:853
工業廢水氨氮排放指標 瀏覽:825
富士高濾芯多少錢 瀏覽:744
領導視察污水廠工作簡報 瀏覽:39
抽污水做賬算什麼費用 瀏覽:59