这只是关于javascript的技术问题。在javascript中,我的组中的一个成员发现javascript对象创建有些奇怪。由于某种原因,对象中的参数已被视为成员,而不将它们分配给在对象的构造函数中创建的任何成员变量。这些参数也是可变的,如下面的代码块所示。
以下是显示我们正在进行的测试的代码。
function NamedItem(name)
{
name = 5;
this.getName = function ()
{
return name;
}
}
document.write(namedItem.getName() + "\n"); //5
这是合法的吗?这很危险吗?
答案 0 :(得分:4)
这称为closure 嵌套函数可以从其父函数访问变量,并将变量的生命周期扩展到父函数的执行之外。
它与物体无关。
答案 1 :(得分:1)
要明确的是,你正在做的事情有一些潜在的愚蠢的事情。让我解释一些原则。
如果您将一个或多个变量声明为函数(例如function(arg1, arg2)
)的参数,就变量本身而言(而不是它们的值),它基本上与您在顶部的说法相同函数var arg1;
var arg2;
。这些是自动声明的。即使你尝试重新声明它们,它们仍然可以使用传递的参数!
功能是对象。对象可以具有属性。因此,函数可以具有属性,例如this.getName = function()
。
就像@SLaks指出的那样,你在getName
方法的版本中创建了一个闭包。闭包捕获创建时它上面的状态。因此,如果在创建它的范围内有name
变量,它将可以访问其范围内的该名称变量。这是JavaScript中非常常见的做法,您已设法使用公共访问器函数(name
)创建私有属性(getName
)。干得好。
我假设您正在使用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
}
实例,他们都共享一个原型。
改为使用原型:
{{1}}
希望能给你一些思考的东西!
Ĵ