所以我能够通过原型继承意外访问私有变量(numb
)。我有几个问题:
在SIAF完成执行后,自调用匿名函数(SIAF)闭包中的这些私有变量是否已经过期?由于'use strict'
,我原以为它会出错。
如果变量永不过期,那么应该避免将其作为最佳实践的一部分吗?
以下是代码:
'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.
答案 0 :(得分:2)
Javascript中的变量范围是词法。这意味着,范围与源中写的完全相同。函数getNumb
在与变量numb
相同的词法范围中定义,其主体引用该变量(return numb
)。无论您如何或从何处调用该功能都无关紧要。这就是闭包的工作原理。
实际上,这就是Javascript中实现“特权访问器”的方式:你有一个“私有”变量和一个“公共”函数,它可以通过它定义的范围访问该变量。
(我在这里使用了很多关于“私人”和“公共”的“引号”,因为那些是传统的OOP可见性概念,只是模糊地转移到Javascript.Javascript具有简单的词法变量范围,句点。“隐私“,这只是在某些模式中应用这种范围机制来模拟基于类的OOP语义。”