会创设对应的履行上下文(execution,会创制对应的执行上下文(execution

活动对象(AO)与变量对象(VO)分歧

它们其实都以同1个目标,只是处在执行上下文的不等生命周期。未进入实施等级从前,变量对象(VO)中的属性都无法访问,可是进入执行等级之后,执行环境被压入执行环境栈变量对象(VO)转变为了活动对象(AO),里面的品质都能被访问了,然后开端开展实施阶段的操作。

第二题

1     console.log(run)
2     function run() {
3         console.log(a);
4         a = 1;
5     }
6   var run=1;

输出: ƒ run() {
            console.log(a);
             a = 1;
         }

当阐明的变量与函数重名时,注脚的变量会忽视;

假若在第伍,行代码后边添加 console.log(run),那么run
值会被重置为1,因为在上下文对象创设阶段发现早已存在run的函数申明,var
变量会被忽视,当代码在真正实施到6行时run的值被改变了;

1     console.log(run)
2     function run() {
3         console.log(a);
4         a = 1;
5     }
6   var run=1;
7     console.log(run)

澳门金冠网站主页 1

执行等级

在代码执行阶段,会相继执行代码,依照代码执行顺序,修改AO(执行等级执行环境被推入执行环境栈
VO 被激活成为AO)中变量的值  如:

 1 foo.EC.VO = {
 2       arguments: {
 3           0: 'Joel',
 4           length: 1
 5       },
 6       name: 'Joel',//形参
 7       age: 20,
 8       run: reference to function run(){},
 9       say: reference to FunctionExpression say
10  }

推行等级

在代码执行阶段,会挨个执行代码,依照代码执行顺序,修改AO(执行等级执行环境被推入执行环境栈
VO 被激活成为AO)中变量的值  如:

 1 foo.EC.VO = {
 2       arguments: {
 3           0: 'Joel',
 4           length: 1
 5       },
 6       name: 'Joel',//形参
 7       age: 20,
 8       run: reference to function run(){},
 9       say: reference to FunctionExpression say
10  }

创设变量对象进程

因创设执行环境分为八个阶段,所以变量对象也分多个等级来分析:

  1. 初阶化(当函数被调用,未举办代码从前)
  2. 代码执行阶段(开首进行代码)

初始化

VO包括:

1、依照函数的参数,创建并开始化arguments object,值为暗许值
undefined

2、扫描该实施上下文中的函数表明(不包蕴函数表达式)

      a)  找到全体的function
申明,将函数名当做属性创立,值为函数定义

      b)
 在围观过程中一经存在重名的函数表明,那么前面的会覆盖前面的扬言,函数申明与变量申明有争论时,会忽略(以函数注明为主)

三, 扫描该执行上下文中的var变量评释

      a)
 找到全部的变量注脚,将变量名当做属性创设,值早先为undefined

      b)  在扫描进程中只要存在重名的变量评释以及重名的函数表明,会忽略;

一般来说代码:

1     function foo(name) {
2         var age = 20;
3         function run() {}
4         var say = function() {};
5         age = 22;
6     }
7     foo('Joel');

制造执行环境时开头化的变量对象(vo)如下:

 1 foo.EC.VO = {
 2     arguments: {
 3         0: 'Joel',
 4         length: 1
 5     },
 6     name: 'Joel',//参数
 7     age: undefined,
 8     run: reference to function run(){},
 9     say: undefined    
10 }

第二题

1     console.log(run)
2     function run() {
3         console.log(a);
4         a = 1;
5     }
6   var run=1;

输出: ƒ run() {
            console.log(a);
             a = 1;
         }

当申明的变量与函数重名时,表明的变量会忽视;

一旦在第5行代码后边添加 console.log(run),那么run
值会被重置为1,因为在上下文对象创设阶段发现早已存在run的函数注明,var
变量会被忽视,当代码在真的实施到6行时run的值被更改了;

1     console.log(run)
2     function run() {
3         console.log(a);
4         a = 1;
5     }
6   var run=1;
7     console.log(run)

澳门金冠网站主页 2

第一题

 1 <script>
 2     function run() {
 3         console.log(a);
 4         a = 1;
 5     }
 6     run(); // ?
 7     function say() {
 8         a = 1;
 9         console.log(a);
10     }
11     say(); // ?
12 </script>

第贰段会报错:Uncaught ReferenceError: a is not defined。第三段会打印:1

1     function foo(name) {
2 
3         console.log(run);// 输出run 函数定义
4         console.log(say); //undefined
5         function run() {}
6         var say = function () {};
7     }
8     foo('Joel');

函数表明式会当做1个var 变量来处理

总结

  1. 大局上下文的变量对象是全局对象
  2. 函数上下文的变量对象开头化,最伊始只囊括 arguments 对象
  3. 在创造执行上下文时会给变量对象添加形参、函数申明、变量申明等开端的属性值
  4. 在代码执行阶段,会重新修改变量对象的属性值
  5. 开创执行环境—-》伊始化变量对象(AO)(参数、函数表明、var
    变量)—》执行环境被推入栈—-》执行代码—–》VO 激活为AO
    ——》改变AO 的值

 

变量对象

在《javascript
之推行环境-08》文中说到,当JavaScript代码执行一段可举行代码时,会创建对应的施行上下文(execution
context)。对于每一种执行上下文,都有多少个主要性质:

  • 变量对象(Variable object,VO)
  • 作用域链(Scope chain)
  • this 

种种执行环境(执行上下文)都有贰个应和的变量对象(variable
object),环境中形参、函数、定义的装有变量都封存在变量对象中。

第一题

 1 <script>
 2     function run() {
 3         console.log(a);
 4         a = 1;
 5     }
 6     run(); // ?
 7     function say() {
 8         a = 1;
 9         console.log(a);
10     }
11     say(); // ?
12 </script>

率先段会报错:Uncaught ReferenceError: a is not defined。第三段会打印:1

1     function foo(name) {
2 
3         console.log(run);// 输出run 函数定义
4         console.log(say); //undefined
5         function run() {}
6         var say = function () {};
7     }
8     foo('Joel');

函数表明式会当做3个var 变量来拍卖

创制变量对象进度

因创制执行环境分为三个阶段,所以变量对象也分多少个等级来分析:

  1. 起头化(当函数被调用,未举办代码此前)
  2. 代码执行阶段(起首举行代码)

思考题

大局上下文中的VO

上篇中说到实施环境分为全局执行环境,函数执行环境,在本文开篇说到种种执行环境对应3个变量对象:

各个执行环境(执行上下文)都有2个亦步亦趋的变量对象(variable
object),环境中(执行上下文中)定义的有所形参、变量、函数都保存在那一个目的中,那么全局执行环境是否可以领略为也设有三个全局变量对象。

咱俩先了然贰个定义,什么叫叫全局对象。在 W3School 中也有介绍:

全局对象是预约义的对象,作为 JavaScript
的大局函数和大局属性的占位符。通过利用全局对象,可以访问具有其他兼具预约义的对象、函数和总体性。

在顶层 JavaScript 代码中,可以用关键字 this
引用全局对象。但平日不必用那种方法引用全局对象,因为全局对象是法力域链的头,那象征全体非限定性的变量和函数名都会作为该目的的属性来查询。

例如,当JavaScript 代码引用 parseInt() 函数时,它引用的是全局对象的
parseInt 属性。全局对象是法力域链的头,还表示在顶层 JavaScript
代码中宣示的装有变量都将变为全局对象的属性。

1.足以透过 this 引用,在客户端 JavaScript 中,全局对象就是 Window 对象。

console.log(this);

2.全局对象是由 Object 构造函数实例化的2个目的。

console.log(this instanceof Object);

3.预约义了一大堆函数和性质。

// 都生效
console.log(Math.random());
console.log(this.Math.random());

4.当作全局变量的宿主。

var a = 1;
console.log(this.a);

5.客户端 JavaScript 中,全局对象有 window 属性指向本身。

var a = 1;
console.log(window.a);

this.window.b = 2;
console.log(this.b);

写了那般多介绍全局对象,其实就是想说:全局上下文中的变量对象就是window

大局上下文中的VO

上篇中说到实施环境分为全局执行环境,函数执行环境,在本文开篇说到每种执行环境对应1个变量对象:

各个执行环境(执行上下文)都有1个应和的变量对象(variable
object),环境中(执行上下文中)定义的持有形参、变量、函数都保留在那些目的中,那么全局执行环境是或不是可以领略为也设有一个全局变量对象。

大家先精晓二个概念,什么叫叫全局对象。在 W3School 中也有介绍:

全局对象是预订义的对象,作为 JavaScript
的全局函数和全局属性的占位符。通过应用全局对象,可以访问具有其余兼具预订义的目的、函数和属性。

在顶层 JavaScript 代码中,可以用关键字 this
引用全局对象。但常见不必用那种措施引用全局对象,因为全局对象是成效域链的头,那意味着全体非限定性的变量和函数名都会作为该目标的习性来查询。

譬如说,当JavaScript 代码引用 parseInt() 函数时,它引用的是大局对象的
parseInt 属性。全局对象是作用域链的头,还表示在顶层 JavaScript
代码中扬言的装有变量都将改为全局对象的品质。

1.得以经过 this 引用,在客户端 JavaScript 中,全局对象就是 Window 对象。

console.log(this);

2.全局目的是由 Object 构造函数实例化的2个对象。

console.log(this instanceof Object);

3.预约义了一大堆函数和总体性。

// 都生效
console.log(Math.random());
console.log(this.Math.random());

4.看作全局变量的宿主。

var a = 1;
console.log(this.a);

5.客户端 JavaScript 中,全局对象有 window 属性指向自个儿。

var a = 1;
console.log(window.a);

this.window.b = 2;
console.log(this.b);

写了如此多介绍全局对象,其实就是想说:全局上下文中的变量对象就是window

因而VO创制进度来看变量提高(Hoisting)

变量提高的原形就是函数在创制执行环境时变量对象初阶化下了形参、函数表明、var
申明的变量;

 1 <script>
 2   function run(){
 3       console.log(name);
 4       console.log(say);
 5       var name='Joel';
 6       function say(){
 7           console.log('say');
 8       }
 9   }
10     run();
11 </script>

 

澳门金冠网站主页 3

如上代码能够知道为如此:

 1   function run(){
 2     function say(){  //Hoisting
 3           console.log('say'); 
 4       }
 5      var name=undefined; //Hoisting
 6 
 7       console.log(name);
 8       console.log(say);
 9       name='Joel';
10       
11   }
12     run();

变量对象

在《javascript
之推行环境-08》文中说到,当JavaScript代码执行一段可进行代码时,会创立对应的履行上下文(execution
context)。对于逐个执行上下文,都有三个基本点性质:

  • 变量对象(Variable object,VO)
  • 职能域链(Scope chain)
  • this 

各种执行环境(执行上下文)都有二个对应的变量对象(variable
object),环境中形参、函数、定义的兼具变量都保留在变量对象中。

活动对象(AO)与变量对象(VO)不相同

它们其实都以同一个对象,只是处于执行上下文的例外生命周期。未进入执行等级此前,变量对象(VO)中的属性都不能访问,可是进入实践阶段之后,执行环境被压入执行环境栈变量对象(VO)转变为了活动目标(AO),里面的品质都能被访问了,然后开端举办实践阶段的操作。

初始化

VO包括:

壹,依据函数的参数,创制并开端化arguments object,值为暗中同意值
undefined

二,扫描该实施上下文中的函数阐明(不包含函数表明式)

      a)  找到全数的function
表明,将函数名当做属性创制,值为函数定义

澳门金冠网站主页,      b)
 在扫描进程中一经存在重名的函数声明,那么前边的会覆盖前面的申明,函数表明与变量申明有争持时,会忽视(以函数申明为主)

叁, 扫描该执行上下文中的var变量申明

      a)
 找到全体的变量声明,将变量名当做属性成立,值开头为undefined

      b)  在围观进程中一经存在重名的变量声明以及重名的函数注明,会忽视;

一般来说代码:

1     function foo(name) {
2         var age = 20;
3         function run() {}
4         var say = function() {};
5         age = 22;
6     }
7     foo('Joel');

创建执行环境时初步化的变量对象(vo)如下:

 1 foo.EC.VO = {
 2     arguments: {
 3         0: 'Joel',
 4         length: 1
 5     },
 6     name: 'Joel',//参数
 7     age: undefined,
 8     run: reference to function run(){},
 9     say: undefined    
10 }

思考题

经过VO创设进度来看变量提高(Hoisting)

变量进步的实质就是函数在开创执行环境时变量对象开端化下了形参、函数声明、var
讲明的变量;

 1 <script>
 2   function run(){
 3       console.log(name);
 4       console.log(say);
 5       var name='Joel';
 6       function say(){
 7           console.log('say');
 8       }
 9   }
10     run();
11 </script>

 

澳门金冠网站主页 4

如上代码可以领略为如此:

 1   function run(){
 2     function say(){  //Hoisting
 3           console.log('say'); 
 4       }
 5      var name=undefined; //Hoisting
 6 
 7       console.log(name);
 8       console.log(say);
 9       name='Joel';
10       
11   }
12     run();

总结

  1. 大局上下文的变量对象是大局对象
  2. 函数上下文的变量对象开首化,起始导只囊括 arguments 对象
  3. 在创立执行上下文时会给变量对象添加形参、函数声明、变量注解等上马的属性值
  4. 在代码执行阶段,会另行修改变量对象的属性值
  5. 创立执行环境—-》初阶化变量对象(AO)(参数、函数申明、var
    变量)—》执行环境被推入栈—-》执行代码—–》VO 激活为AO
    ——》改变AO 的值

 

相关文章