欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

谁能用简单明白的一句话总结下执行上下文是什么意思 有大用

  1.  

  2. 问答详情

               
1                    

谁能用简单明白的一句话总结下执行上下文是什么意思?? 是作用域吗


                           
hackerws  1.4k                                
2015-10-02 提问                            
默认排序时间排序                
12 个回答
9                        

已采纳                        

有时候是这样的,译者在翻译书的的时候不知道拿什么来对应相应的英文,就根据自己的感觉,好像大概是这个意思来强加给广大读者,让很多人不知所以然。

@原磨豆浆 的大意是对的,上下文的原意是 context, 作用域的原意是scope, 这两个不是一个东西。

每一个函数的调用(function invocation) 都有对应的scope 和context.

scope 指的是 函数被调用的时候, 各个变量的作用区域
context 指的是 current scope and its enclosing scope. 就是当前scope 和包裹它外面的scope. 如果一个变量在当前scope没找到,那么它会自底向上继续找enclosing scope 直到找到为止。很像javascript 的prototype那样的找法。经常在javascript中,函数被调用的时候, 查看this 指向哪个object, 那么那个object 就是当前的 "上下文"。
图片描述
还有就是要知道JavaScript中 函数被调用有四种方式:

  • The Method Invocation Pattern

  • The Function Invocation Pattern

  • The Constructor Invocation Pattern

  • The Apply Invocation Pattern

为什么要区分这些,因为每一种中的this指向的对象是不同的。

以最后一个为例解释一下context                            

// 一个函数, 自己执行的时候没意义,因为它不知道 this 是谁
function foo() { this.saySomething('good') };

obj1 = { saySomething: function(x) { console.log('im from obj1' + x); } }

obj2 = { saySomething: function(x) { console.log('im from obj2' + x); } }

foo.call(obj1); // 把this 绑定给 obj1, context 就是 obj1
foo.call(obj2);// 把this 绑定给 obj2, context 就是  obj2
                           

后面还有一些语言上的小坑比如 函数里面的函数(closure) 里 默认的 this指向的是global, 而不是当前的object。 所以你经常会看到 var that = this 或者 var self = this的 小技巧 这就是保存context, 以便后面可以引用。

推荐书目:


                               
drbelfast  659                                    
2018-02-05 更新                                    
16                        

小明告诉小红:“你放心吧,他答应你的条件了。”

在读者的眼中,“他”是谁根本无从知晓,因为这句话缺少“上下文”;

从小强家里出来后,小明告诉小红:“你放心吧,他答应你的条件了。”

谁都知道,“他”指的是“小强”,因为有“上下文”。

以 JavaScript 为例


// 如果只看这个函数,谁都无法确认 `this` 是谁,因为缺乏“上下文”
function someFunction() {
    console.log(this.xxx)
}

// 解释器在此情形下会将 `this` 视作 `window` 对象(浏览器中)
// 由于 `window.xxx` 并不存在,所以会输出 `undefined`
someFunction()    // undefined

// 然而,一些方法可以帮助我们指明“上下文”,于是就不会含糊不清;比如:
var test = { xxx: 'hello' }

someFunction.call(test)    // "hello"
                           

一句话说清楚并不容易,见谅。

顺便一提:“上下文”这个翻译并没有错误,关键是很多人念了许多年的语文都没有弄清楚“上下文”到底是什么意思,读书没有读透罢了——所以我一直强调其实文科生学编程也是有特殊优势的,至少理解能力会强上一些(我指的是普遍性,而非特例,谢绝抬杠)。

而“语境”一词其实可视作是“上下文”一词的高逼格版本,或者说更书面化的用词。用哪个词其实并不重要,懂一就能懂二,举一便可反三。


                               
n͛i͛g͛h͛t͛i͛r͛e͛  30.3k                                    
2015-10-03 更新                                    
1                        

我认为上下文就是当前代码能够访问到的对象、变量的集合


                               
代码宇宙  14.8k                                    
2015-10-02 回答                                    

我觉得上下文这个词太抽象。其实就是和阅读一样,就是种语境。javascript里面的上下文主要和this比较有关系。javscript引擎在执行代码前会确定每一段代码的上下文,通过打印this可以知道上下文指向什么,其实这个概念你代码写多了会有感受的。


                               
原磨豆浆  206                                    
2015-10-02 回答                                    
1                        

可以理解为当前容器下的载体 。就好比一本书的目录,父级目录都是载体,目录有根目录 二级三级等等 ,根目录就是最大载体 承载了其他目录 并且其他目录下的子元素能通过爬树的方式爬到根目录

对于 一个元素而言,他的上下文可大可小,取决于他要用的值。 比如

clipboard.png                            

1.1.1 三级上下文是 1.1 二级上下文是 1 一级上下文是 根目录

而通常 我们想取其他目录下的东西都需要用到上下文

比如我想在 1.1.1中使用1.3.1的东西 我需要 爬到二级目录下 然后通过1-->1.3-->1.3.1拿到相应的东西

而此时 上下文 指的就是 二级上下文1,以此类推

但是往往我们都不确定我们在这个目录想将来会用到哪个其他目录下的值 ,所以我们一般都会把当前最大的上下文也就是根目录当做我们常常所说的上下文 因为根目绝对能爬到你想要的目录


                               
叶良辰  81                                    
2015-10-09 更新                                    
1                        
var name = "global"
var func = function(){console.log(this.name)};
var obj_a = {name:"obj_a",func:func}
var obj_b = {name:'obj_b'}

func();//global
obj_a.func();//obj_a
func.call(obj_b);//obj_b
                       

                               
ouyangbin  130                                    
2015-10-15 回答                                    
0                        

上下文 就是 一个事儿 你让我去干前一半 我干完了 
我交接给你的东西 
你拿着这个东西 根据里面的内容 就能继续干后面的一半


                               
freewolf  4.5k                                    
2015-10-02 回答                                    
0                        

前面几位都从词义角度解释了上下文,说得并没有问题,但是新手比较难理解。我从实用角度来说一下。
我拿Perl举例,Perl语言有一个特性,函数内可以根据调用函数的上下文返回标量或列表。即在函数内用wantarray判断调用的上下文。如果

def someFunc() {
    return wantarray?(1,2,3):1;
}
$a=someFunc(); # 得到标量返回
@a=someFunc(); # 得到列表返回
                           

这就是上下文。


                               
KylinHuang  99                                    
2015-10-03 回答                                    
0                        

上下文指的是当前的CPU寄存器状态。


                               
Legend94rz  1                                    
2015-10-09 回答                                    
0                        

其实这个东西也困扰了我好多年,我尝试从语境角度理解一下。
以绘图为例:
绘图在很多编程语言中都有涉及,在现实生活中,绘图其实就是画一幅画。绘画需要有画布,颜料,画笔等。可以画线条,也可以画图像。可以画一个空心圆形,也可以画一个实心圆。当你执行画图这个动作的时候(编程语言中通常是draw()函数),其实是所有的条件(画布,颜料,线条,颜色等等)都在同时起作用,请注意,同时起作用,这些共同起作用的东西(或者叫条件),就是绘图的上下文。说白了,就是你绘图所需要的所有条件,请注意,是所有条件。
在编程语言中,当你执行draw()函数时,通常会涉及一个对象(或者是指针),这个对象可以操作与绘图相关的大部分资源(画布,颜料,画笔等等),这个对象也可以叫绘图上下文。


                               
随雨而来  3                                    
2015-10-09 回答                                    
0                        

为啥一定要用js说话,上下文简单说就是程序执行时的cpu的寄存器状态和内存的一些数据


                               
xwfang  36                                    
2015-10-14 回答                                    
0                        

上下文就是当前执行所处的环境,不如说当前执行的前一步执行的是什么,当前执行在什么容器里等


来自  https://segmentfault.com/q/1010000003815144


image.png

来自 https://blog.csdn.net/luo15256533579/article/details/78224530



js上下文总结

 版权声明:三和小钢炮 https://blog.csdn.net/fwx426328/article/details/83304079

01 context

任何方法,谁调用了它,则就是它的context。

这个和this的描述是一致的:

this最终指向的是调用它的对象

上下文就是this的指向。                


02 不稳定的context

context在js的表现经常出现一些看似"不稳定"的情况,下面列出了一些"不稳定"。

(1) new和非new

下面是一道常见的面试题,问①和②分别输出什么结果?

function say() {
  console.log(this);
};

new say(); // ①
say(); // ②

   
               

虽然简单,却是对context最全的理解。
①输出 say 的实例
输出window吗?
显然我们凭借这段代码是无法做出对②的判断,因为我们根本不知道say()的运行环境是什么。


(2) 方法赋值

下面试题,将方法赋值给一个变量。

var name = "嗷嗷嗷";
var cat = {
  name: "喵",
  say: function() {
    console.log(this.name);
  }
}
var say = cat.say;
cat.say(); // ①
say(); // ②

   
               

结果:
①输出 喵
②输出 嗷嗷嗷

这里可以理解:因为say其实只是引用了一个函数,函数的运行依赖context,不同的context必然有不同结果。


(3) Event Loop

Event Loop又叫事件循环,由于js没有多线程,处理多个任务的时候,就需要采用异步队列(如定时器、I/O、Promse),或者利用浏览器的多线程启动多个任务(如ajax)。

那么异步任务,它的context就是浏览器当前打开的窗口了,即window。

下面是一个常见的面试问题:

function say() {
  setTimeout(function() {
    console.log(this);
  }, 0);
};
new say(); //①
say(); //②

               

①和②都输出window。


(4) 自执行函数

看下面一个问题:

function say() {
  (function() {
    console.log(this);
  })();
};
new say(); //①
say(); //②

   
               

①和②都输出window,这里也说明了自执行函数是被window调用。


03 闭包拯救世界

面对不稳定的context,闭包可以被动解决这些问题。
因为我们所期望的context,和闭包所表现的scope惊人相似。

于是我们纷纷这样做:

function say() {
  var _this = this;
  setTimeout(function() {
    console.log(_this);
  }, 0);
};
new say(); //①
say(); //②


                               
function say() {
  (function(_this) {
    console.log(_this);
  })(this);
};
new say(); //①
say(); //②

 
               

上面做法用_this代替this,使得正常访问外层this。


04 bind来优化

对于用闭包来改变context的问题,不是很优雅。
用bind会更简洁。

实现是下面代码:

function say() {
  setTimeout(function() {
    console.log(this);
  }.bind(this), 0);
};
new say(); //①
say(); //②

  
               

通过bind直接改变当前函数的context,这样子做法是符合我们的阅读习惯的。


05 call和apply

call和apply又叫对象冒充,是在方法执行的时候,传入一个对象,顶替原有的context。

下面代码通过call,主动改变的执行函数的context。这在封装里面很重要。

<div onclick="clickdiv.call(this)">click me</div>
<script type="text/javascript">
function clickdiv() {
  console.log(this);
}
</script>

  
               

点击div,打印div元素。


06 箭头函数

可能意识到context这个问题,于是es6推出箭头函数。箭头函数采用词法作用域,这使得它和闭包的解决极为相似。

注意:arguments本身在箭头函数下,会指向外层函数的arguments (同this一样)。

function say() {
  setTimeout(() => {
    console.log(this);
  }, 0);
};
new say(); //①
say(); //②

  
               

这里①和②都正常输出了。


07 Arguments

Arguments也是context绕不过去的坎,Arguments是函数的内部对象,js在执行函数的时候,会根据Arguments初始化函数内部的变量。

arguments.callee可以访问到当前函数。
arguments.callee.caller可以访问调用当前函数的函数。

arguments上面特性严格模式下是不允许被使用的。

来自 https://blog.csdn.net/fwx426328/article/details/83304079



 / 猿问        

js中context是什么意思?有什么作用?

JavaScript            
慕仙森 2019-02-19 17:15:16            

看到有的函数传参会有context,不知道这个context具体是起什么作用来着,不理解js中context的意思,请知道的看官予以解释!!谢谢!

2 回答

?            
慕圣4307870                    

W3C的:

context 属性在 jQuery version 1.10 中被弃用。
context 属性含有被传递到 jQuery 的原始上下文,可能是 DOM 节点上下文,如果未传递节点,则是 document 上下文。


                       

 反对 回复2019-02-20                
    ?            
    拉风的咖菲猫                    

    这个东西每人能教你,还得自己看,执行上下文,这个文章还可以,明白javascript的执行上下文,很多时候对于闭包就会自然明白了。


                           


    来自  http://www.imooc.com/wenda/detail/500369



    JavaScript中的上下文context是什么?

    96 
    Egde             
    2017.12.24 22:45* 字数 135 阅读 121评论 0            

    了解执行上下文才能明白this与作用域到底是什么鬼

    执行上下文是指当一段可执行的代码得到了控制权,此时就进入了一个执行上下文(听起来挺像废话,但这只是一个引子)。执行上下文会组成一个执行上下文栈,栈底是“全局执行上下文”

    现在我认为,以前我理解的函数的出入栈应该是跟执行上下文匹配的。


               

    来自  https://www.jianshu.com/p/88a8d8c59ade            










    普通分类: