Javascript可变参数?
这只是一个关于javascript的技术问题。在javascript中,我小组的一名成员发现javascript对象创建有些奇怪。由于某些原因,对象中的参数已被视为成员,而没有将其分配给在对象的构造函数中创建的任何成员变量。参数也是可变的,如下面的代码块所示 下面的代码显示了我们正在进行的测试Javascript可变参数?,javascript,object,parameters,members,Javascript,Object,Parameters,Members,这只是一个关于javascript的技术问题。在javascript中,我小组的一名成员发现javascript对象创建有些奇怪。由于某些原因,对象中的参数已被视为成员,而没有将其分配给在对象的构造函数中创建的任何成员变量。参数也是可变的,如下面的代码块所示 下面的代码显示了我们正在进行的测试 function NamedItem(name) { name = 5; this.getName = function () { return name;
function NamedItem(name)
{
name = 5;
this.getName = function ()
{
return name;
}
}
document.write(namedItem.getName() + "\n"); //5
这合法吗?它危险吗?那叫a。嵌套函数可以从其父函数访问变量,并将变量的生命周期延长到父函数执行之外 它与对象无关。这称为a。
嵌套函数可以从其父函数访问变量,并将变量的生命周期延长到父函数执行之外
它与对象无关。只是想澄清一下,在你所做的事情中有一些潜在的愚蠢之处。让我解释几个原则
函数(arg1,arg2)
,就变量本身(而不是它们的值)而言,这与在函数顶部声明变量arg1基本相同代码>变量arg2代码>。系统会自动为您声明。即使您尝试重新声明它们,它们仍然可以处理传入的参数
this.getName=function()
getName
方法的版本中创建一个闭包。闭包在创建时捕获其上方事物的状态。因此,如果创建时其作用域中有一个name
变量,则它将有权访问其作用域中的该name变量。这在JavaScript中是一种非常正常的做法,您已经使用公共访问器函数(getName
)创建了一个私有属性(name
)。干得好new
关键字创建NamedItem
的实例,如下所示var item=newnameditem(“javascripter”)
。另一种方法(使用的内存比您现在所做的要少)是添加getName()
函数调用NamedItem
的原型,如下所示。原型方法的缺点是,您可以轻松地直接访问\u name
。JavaScript中没有传统意义上的私有属性,但有些人使用下划线前缀向人们表明他们是私有的,并且不要使用它们。这种方法(原型)比您的方法使用更少的内存,因为如果您创建多个NamedItem
实例,它们都共享一个原型function NamedItem(name) {
this._name = name
}
NamedItem.prototype.getName = function() {
return this._name
}
希望这能给你一些思考的东西
J我只是想澄清一下,你所做的事情可能有一些愚蠢的地方。让我来解释一些原则
函数(arg1,arg2)
,则根据变量本身(而不是其值)本质上,这与在函数顶部声明var arg1;
var arg2;
是一样的。它们是自动为您声明的。即使您尝试重新声明它们,它们仍然可以使用传入的参数this.getName=function()
getName
方法版本中创建一个闭包。闭包在创建时捕获其上方事物的状态。因此,如果创建时其作用域中存在name
变量,则它将有权访问其作用域中的name变量。这是一种非常正常的做法n JavaScript,并且您已经使用公共访问器函数(getName
)创建了一个私有属性(name
),做得很好new
关键字创建NamedItem
的实例,如下所示函数调用NamedItem
的原型,如下所示。原型方法的缺点是,您可以轻松地直接访问\u name
。JavaScript中没有传统意义上的私有属性,但有些人使用下划线前缀向人们表明他们是私有的,并且不要使用它们。这种方法(原型)比您的方法使用更少的内存,因为如果您创建多个NamedItem
实例,它们都共享一个原型function NamedItem(name) {
this._name = name
}
NamedItem.prototype.getName = function() {
return this._name
}
希望这能给你一些思考的东西
J更像是用JavaScript编程的现实。更像是用JavaScript编程的现实。这给了你真正私有变量的好处。没有人可以从外部更改它。所以参数“name”可以作为一个成员,而不需要让成员保存“name”中的值,这很好吗?@Wes:它不是一个成员。它是Just被恰好是成员的函数捕获。如果
return function(){return name;}
如果不创建对象,您将获得相同的行为。这将为您带来真正私有变量的好处。没有人可以从外部更改它。因此,参数“name”可以作为成员而不创建成员来保存“name”中的值,这没关系吗?@Wes:它不是一个成员。它只是由碰巧发生在成为会员。如果你