导航:首页 > 净水问答 > 过滤获取上下文

过滤获取上下文

发布时间: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

阅读全文

与过滤获取上下文相关的资料

热点内容
江西食品工业污水处理设备多少钱 浏览:212
反渗透法得到的纯净水 浏览:123
油烟净化器机芯怎么卸装 浏览:387
纯净水在日本储存多少吨 浏览:923
饮水机的一桶水多少克 浏览:102
纯水运行设备树脂入水压力是多少 浏览:841
热水器不除水垢 浏览:46
利佰特污水提升泵 浏览:293
蒸馏冷水下进上出 浏览:316
美的豌豆净水机怎么更换滤芯 浏览:312
水处理反渗透工艺控制指标 浏览:405
30天纯水断加运动可以瘦多少钱 浏览:671
净水机滤芯更换怎么申请 浏览:492
新开源净水器多少钱一台 浏览:206
纯水的水势为什么比溶液的高 浏览:78
完美净水器价格是多少 浏览:200
养殖废水处理方案百度文库 浏览:397
过滤材料ph升高 浏览:433
过滤是不是越强大越好 浏览:227
监测污水处理的资质 浏览:147