0

因此,我能够numb通过原型继承意外地访问私有变量 ()。我有一些问题:

  1. 自调用匿名函数 (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 中的实现方式:您有一个“私有”变量和一个“公共”函数,该函数可以通过它定义的范围访问该变量。

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

于 2015-01-20T00:28:33.357 回答