为什么允许通过原型继承访问另一个闭包范围内的私有变量?

时间:2015-01-20 00:21:52

标签: javascript self-invoking-function

所以我能够通过原型继承意外访问私有变量(numb)。我有几个问题:

  1. 在SIAF完成执行后,自调用匿名函数(SIAF)闭包中的这些私有变量是否已经过期?由于'use strict',我原以为它会出错。

  2. 如果变量永不过期,那么应该避免将其作为最佳实践的一部分吗?

  3. 以下是代码:

    '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/

1 个答案:

答案 0 :(得分:2)

Javascript中的变量范围是词法。这意味着,范围与源中写的完全相同。函数getNumb在与变量numb相同的词法范围中定义,其主体引用该变量(return numb)。无论您如何或从何处调用该功能都无关紧要。这就是闭包的工作原理。

实际上,这就是Javascript中实现“特权访问器”的方式:你有一个“私有”变量和一个“公共”函数,它可以通过它定义的范围访问该变量。

(我在这里使用了很多关于“私人”和“公共”的“引号”,因为那些是传统的OOP可见性概念,只是模糊地转移到Javascript.Javascript具有简单的词法变量范围,句点。“隐私“,这只是在某些模式中应用这种范围机制来模拟基于类的OOP语义。”