2

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

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

function NamedItem(name)
{
    name = 5;

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


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

这是合法的吗?危险吗?

4

2 回答 2

6

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

它与对象无关。

于 2012-01-27T05:35:21.503 回答
3

为了清楚起见,您正在做的事情可能有些愚蠢。让我解释几个原则。

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

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

  3. 就像@SLaks 指出的那样,您正在您的getName方法版本中创建一个闭包。闭包在创建时捕获其上方事物的状态。name因此,如果在创建时它的作用域中有一个变量,它将可以访问其作用域中的该名称变量。这是 JavaScript 中的一种非常正常的做法,您已经成功地创建了一个name带有公共访问器函数 ( ) 的私有属性 ( getName)。做得好。

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

改用原型:

function NamedItem(name) {
    this._name = name
}

NamedItem.prototype.getName = function() {
    return this._name
}

希望能给你一些思考!

Ĵ

于 2012-01-27T05:51:51.197 回答