0

numbそのため、プロトタイプの継承を介して、誤ってプライベート変数 ( ) にアクセスできました。いくつか質問があります。

  1. Self-invoking anonymous function (SIAF) クロージャー内のこれらのプライベート変数は、SIAF の実行が終了した後に既に期限切れになっているはずではありませんか? が原因でエラーになると思っていました'use strict'

  2. 変数が期限切れにならないことを意図している場合、これはベスト プラクティスの一部として回避する必要がありますか?

コードは次のとおりです。

'use strict';

var GLOBAL = {};


// SELF-INVOKING ANONYMOUS FUNCTION
(function(){

    var numb = 110;
    var Person = function(first_name, last_name) {
        this.name = first_name + ' ' + last_name;
    };

    Person.prototype.getNumb = function() { return numb; };

    GLOBAL.Person = Person;
})();


// ANOTHER SELF-INVOKING ANONYMOUS FUNCTION
(function(){
    function Animal(type_of_animal) {
      this.type = type_of_animal; 
    }

    Animal.prototype = Object.create(GLOBAL.Person.prototype);
    GLOBAL.Animal = Animal;
})();



var dog = new GLOBAL.Animal('dog'); 
console.log( dog.getNumb() ); // This logs 110 to the console.

これがフィドルです:http://jsfiddle.net/6w2L1y5w/1/

4

1 に答える 1

2

Javascript の変数スコープはレキシカルです。つまり、スコープはソースに書かれているとおりです。関数getNumbは変数と同じレキシカル スコープで定義され、numbその本体はその変数 ( return numb) を参照しています。その関数を呼び出す方法や場所は関係ありません。これがクロージャの仕組みです。

実際、これは「特権アクセサー」が Javascript で実装される方法です。1 つの「プライベート」変数と、定義されているスコープを介してその変数にアクセスできる 1 つの「パブリック」関数があります。

(ここでは「プライベート」と「パブリック」の周りに多くの「引用符」を使用しています。これらは、漠然とJavascriptに転送される従来のOOP可視性の概念であるためです。Javascriptには単純なレキシカル変数スコープ、ピリオドがあります。「プライバシー」などはまさにこのスコープ メカニズムを特定のパターンに適用して、クラス ベースの OOP セマンティクスをエミュレートします。)

于 2015-01-20T00:28:33.357 に答える