Javascript可变参数?

时间:2012-01-27 05:31:20

标签: javascript object parameters members

这只是关于javascript的技术问题。在javascript中,我的组中的一个成员发现javascript对象创建有些奇怪。由于某种原因,对象中的参数已被视为成员,而不将它们分配给在对象的构造函数中创建的任何成员变量。这些参数也是可变的,如下面的代码块所示。

以下是显示我们正在进行的测试的代码。

function NamedItem(name)
{
    name = 5;

    this.getName = function ()
    {
        return name;
    }
}


document.write(namedItem.getName() + "\n");  //5

这是合法的吗?这很危险吗?

2 个答案:

答案 0 :(得分:4)

这称为closure 嵌套函数可以从其父函数访问变量,并将变量的生命周期扩展到父函数的执行之外。

它与物体无关。

答案 1 :(得分:1)

要明确的是,你正在做的事情有一些潜在的愚蠢的事情。让我解释一些原则。

  1. 如果您将一个或多个变量声明为函数(例如function(arg1, arg2))的参数,就变量本身而言(而不是它们的值),它基本上与您在顶部的说法相同函数var arg1; var arg2;。这些是自动声明的。即使你尝试重新声明它们,它们仍然可以使用传递的参数!

  2. 功能是对象。对象可以具有属性。因此,函数可以具有属性,例如this.getName = function()

  3. 就像@SLaks指出的那样,你在getName方法的版本中创建了一个闭包。闭包捕获创建时它上面的状态。因此,如果在创建它的范围内有name变量,它将可以访问其范围内的该名称变量。这是JavaScript中非常常见的做法,您已设法使用公共访问器函数(name)创建私有属性(getName)。干得好。

  4. 我假设您正在使用NamedItem这样的new关键字创建var item = new NamedItem("javascripter")的实例。 getName()。另一种方式(并且使用比你正在做的更少的内存是将NamedItem函数添加到_name的原型中,如下所示。原型方法的缺点是你可以像很容易直接访问NamedItem。在JavaScript中没有传统意义上的私有属性,但有些人使用下划线前缀向人们表明他们是私有的而不是使用它们。这种方法(原型)使用较少内存比你的方法,因为如果你创建多个function NamedItem(name) { this._name = name } NamedItem.prototype.getName = function() { return this._name } 实例,他们都共享一个原型。

  5. 改为使用原型:

    {{1}}

    希望能给你一些思考的东西!

    Ĵ