ミニマリスト JavaScript の変数オブジェクト

coldplay.xixi
リリース: 2021-03-21 14:54:25
転載
1942 人が閲覧しました

JavaScript 内部電源変数オブジェクト

ミニマリスト JavaScript の変数オブジェクト

##ディレクトリ #まえがき

##1. 変数オブジェクト
    ##2. グローバル変数オブジェクト
  • ##3. 関数変数オブジェクト
  • ##最後に書く
  • # (無料学習の推奨事項:
  • javascript ビデオ チュートリアル
)

序文JavaScript をプログラミングする場合、システムを正常に構築するには関数と変数の宣言を避けることはできませんが、インタプリタはこれらの関数と変数をどこでどのように見つけるのでしょうか?これらのオブジェクトを参照すると、正確には何が起こるのでしょうか? 前回の記事「JavaScriptの実行コンテキスト」でその一部について触れましたが、JavaScriptのコードが実行コード(実行コード)を実行すると、それに対応する実行コンテキスト(実行コンテキスト)が作成されます。

各実行コンテキストには、3 つの重要な属性があります:

変数オブジェクト (VO)

スコープ チェーン(スコープ チェーン)

this

  • #1. 変数オブジェクト
  • 関数コンテキストでは、アクティベーション オブジェクト (アクティベーション オブジェクト、AO) を使用します。変数オブジェクトを表現します。

アクティブ オブジェクトと変数オブジェクトミニマリスト JavaScript の変数オブジェクト実際には同じものです

:

変数オブジェクトは標準化またはエンジンによって実装されており、JavaScript 環境 Access では使用できません

実行コンテキストに入ったときのみ、この実行コンテキストの変数オブジェクトがアクティブ化されるため、これをアクティブ化オブジェクトと呼びます。アクティブ化された変数オブジェクト、つまりアクティブ オブジェクトのプロパティ上のさまざまな変数のみをアクティブにすることができます。アクセスされました。

この 2 つの関係についての Tapir Da の回答をここに添付します:

  1. コードを使用して変数オブジェクトの作成プロセスをシミュレートできます:
  2. 1. 通常のオブジェクトを使用して変数オブジェクト
  3. var VO = {}; // 变量对象
    ログイン後にコピー
2. 変数オブジェクトは実行コンテキストの属性です:

activeContext = {
  VO: {
    // 上下文数据(var, FD, function arguments)
  }};
ログイン後にコピー

3. 次のコードが発生したとき いつ: ミニマリスト JavaScript の変数オブジェクト
var a = 10;function func(x){
    var b = 20;}func(30);
ログイン後にコピー
4. 対応する変数オブジェクトは次のようになります:

// 全局变量对象VO(Global) = {
    a: 10,
    func: reference to function plus(){}}// func函数上下文的变量对象VO(func functionContext) = {
  x: 30,
  b: 20};
ログイン後にコピー
異なる実行コンテキストでの変数オブジェクトは若干異なるため、個別に説明します。

2. グローバル変数オブジェクト

まずはグローバルオブジェクトという概念を理解しましょう。 W3School でも紹介されています:

ミニマリスト JavaScript の変数オブジェクトグローバル オブジェクトは、JavaScript グローバル関数およびグローバル プロパティのプレースホルダーとして機能する事前定義されたオブジェクトです。グローバル オブジェクトを使用すると、他のすべての定義済みオブジェクト、関数、プロパティにアクセスできます。

1. これを通じて参照できます。クライアントサイド JavaScript では、グローバル オブジェクトは Window オブジェクトです。

console.log(this); //Window
ログイン後にコピー
2. グローバル オブジェクトは、Object コンストラクターによってインスタンス化されるオブジェクトです。

console.log(this instanceof Object); // true
ログイン後にコピー
3. たくさんの、まあ、たくさんの関数とプロパティが事前定義されています。
// 都能生效console.log(Math.random());  //随机数console.log(this.Math.random()); //随机数
ログイン後にコピー

4. グローバル変数のホストとして (非常に素晴らしい)

var a = 1;console.log(this.a);// 1
ログイン後にコピー
5. クライアントサイド JavaScript では、グローバル オブジェクトはそれ自体を指す window 属性を持ちます。

var a = 1;console.log(window.a); // 1this.window.b = 2;console.log(this.b); // 2
ログイン後にコピー
そして、グローバル コンテキストの

変数オブジェクト

がグローバル オブジェクトです。

3. 関数コンテキストの変数オブジェクト

関数実行コンテキストでは、VO に直接アクセスできません。

アクティベーション オブジェクト

(アクティベーション オブジェクト、AO と略記) は、ミニマリスト JavaScript の変数オブジェクトVO

の役割を果たします。

VO(functionContext) === AO
ログイン後にコピー
アクティブ オブジェクトは、関数コンテキストに入るときに作成され、関数の argument 属性を通じて初期化されます。 argument 属性の値は Arguments オブジェクトです:
AO = {
    arguments: }
ログイン後にコピー
Arguments オブジェクトはアクティブ オブジェクトの属性であり、次の属性が含まれます:

callee - 呼び出し先への参照current functionlength — 実際に渡されるパラメータの数

properties-indexes (文字列型の整数) プロパティの値は、関数のパラメータ値です (左から右に配置)パラメータリスト)。

properties-indexes 内の要素の数は、arguments.length と等しくなります。properties-indexes の値は、実際に渡されるパラメータと共有されます。

  1. 次のコードを見てみましょう:
  2. function foo(x, y, z) {
     
      // 声明的函数参数数量arguments (x, y, z)
      alert(foo.length); // 3
     
      // 真正传进来的参数个数(only x, y)
      alert(arguments.length); // 2
     
      // 参数的callee是函数自身
      alert(arguments.callee === foo); // true
     
      // 参数共享
     
      alert(x === arguments[0]); // true
      alert(x); // 10
     
      arguments[0] = 20;
      alert(x); // 20
     
      x = 30;
      alert(arguments[0]); // 30
     
      // 不过,没有传进来的参数z,和参数的第3个索引值是不共享的
    
      z = 40;
      alert(arguments[2]); // undefined
     
      arguments[2] = 50;
      alert(z); // 40
     }
     foo(10, 20);
    ログイン後にコピー
  3. 3.1 実行プロセス
  4. 実行コンテキスト コードは、処理のために分析と実行の 2 つの段階に分割されます。
  5. 実行コンテキストを入力します

コード実行

3.2 実行コンテキストを入力します

実行に入るときコンテキスト、今回はコードは実行されません。
  1. 変数オブジェクトには以下が含まれます:
関数のすべての仮パラメータ (関数コンテキストの場合)

  • 由名称和对应值组成的一个变量对象的属性被创建
  • 没有实参,属性值设为 undefined

  • 函数声明

    • 由名称和对应值(函数对象(function-object))组成一个变量对象的属性被创建
    • 如果变量对象已经存在相同名称的属性,则完全替换这个属性
  • 变量声明

    • 由名称和对应值(undefined)组成一个变量对象的属性被创建;
    • 如果变量名称跟已经声明的形式参数或函数相同,则变量声明不会干扰已经存在的这类属性
  • 举个例子:

    function foo(a) {
      var b = 2;
      function c() {}
      var d = function() {};
    
      b = 3;}foo(1);
    ログイン後にコピー

    在进入执行上下文后,这时候的 AO 是:

    AO = {
        arguments: {
            0: 1,
            length: 1
        },
        a: 1,
        b: undefined,
        c: reference to function c(){},
        d: undefined}
    ログイン後にコピー

    3.3 代码执行

    在代码执行阶段,会顺序执行代码,根据代码,修改变量对象的值

    还是上面的例子,当代码执行完后,这时候的 AO 是:

    AO = {
        arguments: {
            0: 1,
            length: 1
        },
        a: 1,
        b: 3,
        c: reference to function c(){},
        d: reference to FunctionExpression "d"}
    ログイン後にコピー

    到这里变量对象的创建过程就介绍完了,让我们简洁的总结我们上述所说:

    1. 全局上下文的变量对象初始化是全局对象;
    2. 函数上下文的变量对象初始化只包括 Arguments 对象;
    3. 在进入执行上下文时会给变量对象添加形参、函数声明、变量声明等初始的属性值;
    4. 在代码执行阶段,会再次修改变量对象的属性值;

    思考题

    最后让我们看几个例子:

    1.第一题

    function foo() {
        console.log(a);
        a = 1;}foo(); // ???function bar() {
        a = 1;
        console.log(a);}bar(); // ???
    ログイン後にコピー

    第一段会报错:Uncaught ReferenceError: a is not defined

    第二段会打印:1

    这是因为函数中的 “a” 并没有通过 var 关键字声明,所有不会被存放在 AO 中。

    第一段执行 console 的时候, AO 的值是:

    AO = {
        arguments: {
            length: 0
        }}
    ログイン後にコピー

    没有 a 的值,然后就会到全局去找,全局也没有,所以会报错。

    当第二段执行 console 的时候,全局对象已经被赋予了 a 属性,这时候就可以从全局找到 a 的值,所以会打印 1。

    2.第二题

    console.log(foo);function foo(){
        console.log("foo");}var foo = 1;
    ログイン後にコピー

    会打印函数,而不是 undefined 。

    这是因为在进入执行上下文时,首先会处理函数声明,其次会处理变量声明,如果如果变量名称跟已经声明的形式参数或函数相同,则变量声明不会干扰已经存在的这类属性。

    相关免费学习推荐:javascript(视频)

    以上がミニマリスト JavaScript の変数オブジェクトの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    関連ラベル:
    ソース:csdn.net
    このウェブサイトの声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
    最新の問題
    人気のチュートリアル
    詳細>
    最新のダウンロード
    詳細>
    ウェブエフェクト
    公式サイト
    サイト素材
    フロントエンドテンプレート
    私たちについて 免責事項 Sitemap
    PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!