Javascript执行上下文、this、作用域

前置:重要事情说三遍:执行上下文和作用域不一样!不一样!不一样!

1、执行上下文和作用域之间最大的区别是:

执行上下文在运行时确定,随时可能改变;作用域在定义时确定,永远不会改变。

2、每个执行上下文都有三个重要的属性,变量对象(Variable object,VO),作用域链(Scope chain)和this,当然还有一些附加的属性。

实例、

   var a=1;//全局作用域                                          

   function fn1(){

   var a=2; //fn1作用域

    }

 this.a=1;//全局执行上下文                                   

 function fn1(){

this.a=2; //fn1执行上下文

}

var obj=new fn1();


一、执行上下文

综述:每次当控制器转到可执行代码的时候,就会进入一个执行上下文。执行上下文可以理解为当前代码的执行环境,它会形成一个作用域。JavaScript中的运行环境大概包括三种情况。

1、全局环境:JavaScript代码运行起来会首先进入该环境

2、函数环境:当函数被调用执行时,会进入当前函数中执行代码

3、eval

在一个JavaScript程序中,必定会产生多个执行上下文,JavaScript引擎会以堆栈的方式来处理它们。栈永远都是全局上下文,而栈就是当前正在执行的上下文。

当代码在执行过程中,遇到以上三种情况,都会生成一个执行上下文,放入栈中,而处于栈顶的上下文执行完毕之后,就会自动出栈

(1)变量对象VO和活动对象AO

变量对象VO是与执行上下文相关的特殊对象,用来存储上下文的函数声明,函数形参和变量。在global全局上下文中,变量对象也是全局对象自身;在函数执行上下文中,VO是不能直接访问的,此时由活动对象(activation object,缩写为AO)扮演VO的角色。

变量对象VO存储上下文中声明的以下内容

{

}

二、this

this代表了当前对象的一个引用。

1、this指代全局

var name ="global this";

functionglobalTest() {

console.log(this.name); 

 } 

 globalTest();//global this

2、this指代构造函数

var name ="global name";

function showName() {   //构造函数

this.name ="showName function"; 

 }

var obj =new showName();

console.log(obj.name);  //showName 

functionconsole.log(name);  //global name

3、指向某个对象

如果函数作为对象的方法调用,this指向的是这个上级对象,即调用方法的对象

function  showName() {   //普通函数

console.log(this.name); 

 }

var obj = {}; 

 obj.name ="ooo"; 

 obj.show = showName; 

 obj.show();  //ooo

4、apply/call调用时的this

apply和call都是为了改变函数体内部的this指向。

call(thisObj,Object)   ;apply(thisObj,[argArray])

var value ="Global value";

functionFunA() {

this.value ="AAA"; 

 }

functionFunB() {

console.log(this.value);

 } 

 FunB();         //Global value 因为是在全局中调用的FunB(),this.value指向全局的value FunB.call(window);        //Global value,this指向window对象,因此this.value指向全局的value FunB.call(new FunA());         //AAA, this指向参数new FunA(),即FunA对象 FunB.apply(window);           //Global value FunB.apply(new FunA());//AAA

三、作用域

首先,js只有函数作用域(function-based),没有块级作用域,也就是只有函数会有自己的作用域,其他都没有。

接着,作用域分为全局作用域与局部作用域。

全局作用域中的对象可以在代码的任何地方访问,一般来说,下面情况的对象会在全局作用域中:

最外层函数和在最外层函数外面定义的变量

没有通过关键字"var"声明的变量

浏览器中,window对象的属性

局部作用域又被称为函数作用域(Function scope),所有的变量和函数只能在作用域内部使用。


参考:https://www.cnblogs.com/nanchen/p/6055016.html

          https://www.cnblogs.com/lsgxeva/p/7975669.html

          https://www.jianshu.com/p/edb2be5866eb

         https://blog.csdn.net/github_34514750/article/details/52901781

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,463评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,868评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,213评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,666评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,759评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,725评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,716评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,484评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,928评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,233评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,393评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,073评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,718评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,308评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,538评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,338评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,260评论 2 352

推荐阅读更多精彩内容