javascript 之变量对象-09javascript 之变量对象-09

变量对象

以《javascript
之行环境-08》文中说到,当JavaScript代码执行一截可实施代码时,会创对应的尽上下文(execution
context)。对于每个执行上下文,都发三只主要性质:

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

每个执行环境(执行上下文)都来一个相应的变量对象(variable
object),环境遭到形参、函数、定义之持有变量都封存在变量对象中。

变量对象

当《javascript
之履环境-08》文中说及,当JavaScript代码执行一段可实行代码时,会创造对应的实施上下文(execution
context)。对于每个执行上下文,都发生三只基本点性质:

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

每个执行环境(执行上下文)都发出一个遥相呼应的变量对象(variable
object),环境受到形参、函数、定义的装有变量都封存在变量对象中。

创建变量对象过程

坐创造行环境分为两单等级,所以变量对象啊分点儿独阶段来分析:

  1. 初始化(当函数为调用,未履行代码之前)
  2. 代码执行阶段(开始执行代码)

创建变量对象过程

因创造行环境分为两独阶段,所以变量对象呢分割点儿只级次来分析:

  1. 初始化(当函数吃调用,未实行代码之前)
  2. 代码执行阶段(开始执行代码)

初始化

VO包括:

1、根据函数的参数,创办并初始化arguments object,值为默认值
undefined

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

      a)  找到有的function
声明,将函数名为当属性创建,值也函数定义

      b)
 在围观过程遭到假如在重名的函数声明,那么后面的相会挂前的宣示,函数声明与变量声明起冲突时,会忽视(以函数声明为主)

3、 扫描该执行上下文中的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包括:

1、根据函数的参数,创办并初始化arguments object,值为默认值
undefined

2、扫描该执行上下文中的函数声明(不包括函数表达式)

      a)  找到有的function
声明,以函数曰当属性创建,值也函数定义

      b)
 在围观过程被如是重名的函数声明,那么后面的会盖前的扬言,函数声明与变量声明发出冲突时常,会忽略(以函数声明为主)

3、 扫描该执行上下文中的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 }

尽阶段

于代码执行阶段,会相继执行代码,根据代码执行顺序,修改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  }

经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>

 

图片 1

若达到代码可以领略也这样:

 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();

通过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>

 

图片 2

只要齐代码可以掌握呢如此:

 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 <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');

函数表达式会当做一个var 变量来处理

第一题

 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');

函数表达式会当做一个var 变量来处理

第二题

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;
         }

当声明的变量和函数重名时,声明的变量会忽略;

要在第6履代码后面加加 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)

图片 3

第二题

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;
         }

当声明的变量和函数重名时,声明的变量会忽略;

假设当第6执行代码后面加加 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)

图片 4

全局上下文中的VO

达篇中说到执行环境分为全局执行环境,函数执行环境,在本文开篇说到每个执行环境对应一个变量对象:

每个执行环境(执行上下文)都生一个应和的变量对象(variable
object),环境遭到(执行上下文中)定义的有形参、变量、函数都封存在这个目标吃,那么全局执行环境是勿是得解为为设有一个全局变量对象。

我们先行了解一个定义,什么让吃全局对象。在 W3School 中为有介绍:

大局对象是预定义的靶子,作为 JavaScript
的大局函数和大局属性的占用位符。通过利用全局对象,可以拜有其他所有预定义的目标、函数和属性。

在顶层 JavaScript 代码中,可以用要字 this
引用全局对象。但一般不必因此这种方式引用全局对象,因为全局对象是企图域链的腔,这象征所有非限定性的变量和函数名叫都见面当该对象的特性来询问。

诸如,当JavaScript 代码引用 parseInt() 函数时,它引用的是全局对象的
parseInt 属性。全局对象是打算域链的头,还代表当顶层 JavaScript
代码中声称的有变量都将变成全局对象的特性。

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

console.log(this);

2.全局目标是出于 Object 构造函数实例化的一个靶。

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

达到篇被说及实施环境分为全局执行环境,函数执行环境,在本文开篇说及每个执行环境对应一个变量对象:

每个执行环境(执行上下文)都产生一个相应之变量对象(variable
object),环境遭受(执行上下文中)定义之持有形参、变量、函数都保留于是目标吃,那么全局执行环境是免是足以领略啊耶存在一个全局变量对象。

咱俩事先了解一个概念,什么叫吃全局对象。在 W3School 中也出介绍:

全局对象是预定义的对象,作为 JavaScript
的大局函数和全局属性之挤占位符。通过运用全局对象,可以拜具有其他有预定义的靶子、函数和性能。

每当顶层 JavaScript 代码中,可以就此要字 this
引用全局对象。但平常不必为此这种艺术引用全局对象,因为全局对象是图域链的条,这表示有非限定性的变量和函数名叫都见面作该目标的属性来查询。

譬如,当JavaScript 代码引用 parseInt() 函数时,它引用的凡大局对象的
parseInt 属性。全局对象是企图域链的条,还意味着当顶层 JavaScript
代码中扬言的持有变量都拿变为全局对象的属性。

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

console.log(this);

2.全局靶是出于 Object 构造函数实例化的一个对象。

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

移动目标(AO)与变量对象(VO)区别

它其实还是与一个靶,只是处于执行上下文的异生命周期。未入实践阶段前,变量对象(VO)中之性能都无克看,但是上实践等级之后,执行环境让压入执行环境栈变量对象(VO)转变为活动目标(AO),里面的性能都能够给聘了,然后开进行实施等级的操作。

运动对象(AO)与变量对象(VO)区别

她其实都是跟一个靶,只是处在执行上下文的异生命周期。未进入实践阶段前,变量对象(VO)中之习性都未可知顾,但是上实践等级后,执行环境为压入执行环境栈变量对象(VO)转变为活动对象(AO),里面的习性都能被访问了,然后开始进行实践等的操作。

总结

  1. 大局上下文的变量对象是全局对象
  2. 函数上下文的变量对象初始化,最开始仅仅包括 arguments 对象
  3. 每当开立行上下文时会被变量对象上加形参、函数声明、变量声明等上马的属性值
  4. 每当代码执行阶段,会再次修改变量对象的属于性值
  5. 创立行环境—-》初始化变量对象(AO)(参数、函数声明、var
    变量)—》执行环境被推入栈—-》执行代码—–》VO 激活为AO
    ——》改变AO 的值

 

总结

  1. 大局上下文的变量对象是全局对象
  2. 函数上下文的变量对象初始化,最开头仅囊括 arguments 对象
  3. 于开创行上下文时会给变量对象上加形参、函数声明、变量声明等开始的属性值
  4. 于代码执行阶段,会再度修改变量对象的属于性值
  5. 创行环境—-》初始化变量对象(AO)(参数、函数声明、var
    变量)—》执行环境让推入栈—-》执行代码—–》VO 激活为AO
    ——》改变AO 的值

 

相关文章