上下文和命名空间有什么区别?

时间:2011-11-18 12:03:09

标签: namespaces scope this terminology

我多次听过这些话。坦率地说,我认为命名空间是一个包含标识符的环境(以及映射到它的唯一“值”)。上下文就像一个类似于'key' = 'value'类型映射的数据集。我对这些感到困惑。如果有人能够更清楚地描述这些术语,那就太好了。

5 个答案:

答案 0 :(得分:1)

我倾向于这样看:

命名空间是一个容器,您可以在其中找到具有上下文的项目。

例如。

想想一所房子。

每间卧室均配有一张床。假设有主卧室,儿童卧室和备用卧室。

这里的名称空间是卧室的名称,例如Master,Child,Spare。

现在主卧室有一张双人床,儿童卧室有一张单人床,备用房有一张折叠床。

双人床仅在主卧室内设有上下床,仅在儿童床房内提供单人床,在备用房内设有折叠床。

现在所有卧室都有家具(床,梳妆台,衣柜),这些都在家具命名空间中定义。

如果所有房间都提及/使用家具命名空间,那么床,梳妆台,衣柜都在这些房间内有有效的背景,但是双人床在儿童或间隔房内无效。

当然,您可以将折叠床放入儿童卧室,在这种情况下,它会在那里有背景,尽管这与已经在备用房间的折叠床有不同的背景。

如果你搬走了一间房间(比如说有火灾),那么其中有上下文的家具也会被毁坏,例如主卧室的火灾会破坏双人床,梳妆台和衣柜。

答案 1 :(得分:1)

你所说的Namespace是正确的,我会用编程的方式解释你,因为我不是理论家。

namespace SampleNamespace
{
    class foo
    {
          public void run()
         {
           console.writeline("RUN");
         }
    }
}

参见上面的命名空间SampleNamespace包含一个类foo,现在这里的命名空间是一个环境而类是它的数据,所以另一个命名空间也可以包含类'foo',但是同一个命名空间不能包含同一个类。命名空间可以包含n个标识符,就像组织程序一样,以避免使用同名的类。

上下文:它与命名空间大不相同,它不是一个环境,而是为对象定义了一个环境。所以你可以说context是一组属性,它定义了一个对象的环境

答案 2 :(得分:1)

这可能取决于您正在考虑的语言,但使用一些JavaScript作为示例:

var FOO = {
    bar:function(){
        return this == FOO; //=> true
        }
    };

在这种情况下,您可以说 FOO 就像命名空间一样。虽然JavaScript没有正式的命名空间概念,但我们已经定义了一个对象并使用它来划分某些代码。

上下文通常是运行某些内容的环境。在此示例中, bar 函数具有由关键字引用的上下文。运行这样的函数时:

FOO.bar();

我们在 FOO 对象的上下文中调用该函数,因此 FOO 会被分配给 this 。我们可以在不同的上下文中运行代码:

var BAZ={};
BAZ.bar = FOO.bar;
BAZ.bar();

这次函数的上下文是BAZ,因此返回值将为false。

因此,这两个术语都定义了某种环境,但命名空间是一个固定的环境,而上下文可能会根据代码的运行方式而改变。

答案 3 :(得分:0)

Scope is often confusing in JavaScript - on the one hand,
     

它可以表示调用(或执行)某事物的对象   另一个是定义某事物的对象。该   后者被称为词汇范围,被认为是真实的   JavaScript中的范围。词汇范围可以实现这样的编程   封闭技术;供参考,看看这个优秀   Richard Cornford的文章。

     

调用期间范围的概念称为执行上下文   的JavaScript

dojo documentation website中的这一段 对我有帮助。我认为这是一个关于这个问题的好资源。

答案 4 :(得分:0)

来自Wikipedia:“命名空间通常被构造为层次结构,以允许在不同的上下文中重用名称”

假设你有两个命名空间:“空间”和“水” 现在,假设空间具有标识符“ Ship”。让我们也说,“水”有标识“船”。

在这里我们可以重用名称,但是上下文会有所不同。因此,命名空间是一个声明性区域,可为标识符提供范围并实现此目标。

例如,Java软件包将Java类组织到命名空间中。

在许多语言中,函数或方法调用中的本地名称都有其自己的名称空间。调用函数时,将为此函数创建一个本地名称空间。如果函数结束(即返回或引发错误),则删除该名称空间。