你怎么称呼一组共享共同背景的Javascript闭包?

时间:2010-06-12 20:04:37

标签: javascript closures

我一直在尝试学习闭包(在Javascript中),这种方式在使用C#和C ++多年后伤害了我的大脑。我想我现在有一个基本的理解,但有一件事困扰我:我在这个Quest for Knowledge中访问了很多网站,我没有看到任何一个词(甚至是一个简单的双字短语),意思是“一套Javascript闭包共享一个共同的执行上下文“。例如:

function CreateThingy (name, initialValue)
{
    var myName = name;
    var myValue = initialValue;

    var retObj = new Object;

    retObj.getName = function() { return myName; }
    retObj.getValue = function() { return myValue; }
    retObj.setValue = function(newValue) { myValue = newValue; }

    return retObj;
};

从我读过的内容来看,这似乎是实现数据隐藏的一种常见方式。 CreateThingy返回的值当然是一个对象,但是你会将那些作为该对象属性的函数集称为什么?每一个都是一个闭包,但我想用一个名字来描述(和思考)所有这些作为一个概念实体,我宁愿使用一个普遍接受的名称而不是一个。

谢谢!

- Ed

3 个答案:

答案 0 :(得分:3)

Crockford推广术语“privileged method”来命名有权访问其构造函数范围的函数(声明私有成员的位置)。

我会称之为“一组共享一个共同封闭范围的JavaScript函数”

您发布的短语的“执行上下文”部分可能会在规范中描述的Execution Contextsthis值之间产生混淆,这也是众所周知的as “函数上下文”“对象上下文”,以及函数作用域,这就是这里引用的内容。

答案 1 :(得分:1)

您可以将其称为class,但它只是一个包含大量条目的哈希表,其中一些是函数(或闭包)。在Javascript中更常用的方法是使用原型。

一些帮助您的链接:

答案 2 :(得分:0)

它接近模块模式。使用如下表达式:

var thingy = (function(specObj) {
    var my = {},
        privateVar = blah,
        someOtherPrivateVar = [];

    my.getSomeVal() {
        return specObj.someVal;
    }
    my.getAnotherVal() {
        return specObj.AnotherVal;
    }
}({
    someVal: "value",
    anotherVal: "foo"
}));

我使用对象文字初始化,因为使用命名对象将允许通过更改命名对象来更改thingy的状态。还有其他选择。

这是关于模块模式变体的另一个很好的链接: http://www.adequatelygood.com/2010/3/JavaScript-Module-Pattern-In-Depth

几乎不言而喻,但Crockford的 Javascript:The Good Parts 包含了对这种风格及其特定好处的良好处理。