所以这是一个奇怪的:
var a = true;
function f(v){ v = !v; } //can this function actually change a?
f(a); //a is still true..
如果该函数是内部 v
变量,则该函数显然只会更改该值。
我遇到了一个应用程序,它应该在运行时动态地更改DOM
元素的属性值。所以理想情况下应该有一个函数将属性作为参数并重新分配,对吧?
为了清楚起见 - 我实际上是在尝试在运行时为DOM元素的属性分配新值:我有一个反射器应用程序,它遍历对象的成员,我希望它能够更改它遇到的属性的值,所以f函数属于BooleanSwitch构造函数,它为反射对象中的每个布尔类型属性构建booleanSwitch对象。 booleanSwitch可以是屏幕上的一个简单按钮。我希望能够通过单击按钮来更改手头对象的实际属性的值。 谁能想到办法做到这一点?
任何想法都很适合..
答案 0 :(得分:3)
原始值按值传递。您确实将布尔值传递给该函数,因此它无法更改在外部声明的变量a
的值。
答案 1 :(得分:1)
对象(数组,函数)作为参考传递。将复制所有其他类型(int,string等)。
在您的示例中,'v'是'a'的副本,因此'a'不会更改。
您需要从switch函数返回一个值,并将其指定给a。例如:
function switch(v)
{
//do something
return v;
}
a = switch(a);
答案 2 :(得分:1)
该函数必须返回一个值。
function switchValue(v){
return !v;
}
var a = true;
switchValue(a);
这是因为JavaScript引用功能。如果传入变量并且不返回它,则变量只会在本地更改。如果您想要更改它,您必须专门返回它。
答案 3 :(得分:0)
所以我们想出了一个很好的方法:
布尔值,因为其他原始值是按值传递的,但是对象是通过引用传递的。 传递给函数f的布尔值如果属于一个对象,可以通过引用传递。 这样:
var a = true;
function f(v, z){
v[z] = !v[z];
{
f(window, "a");
看起来有点奇怪,仍然是硬编码的,但在迭代对象时可以使其与属性动态协同工作。
在我的实际应用程序中它看起来像这样:
function BooleanSwitch(obj, property){
var btn = document.createElement("button");
btn.onclick = function(){
obj[property] = !obj[property];
}
return btn;
}
function reflect(obj){
for(member in obj){
switch(typeof(obj[member])){
case "boolean":
var booleanSwitch = BooleanSwitch(obj, member);
document.body.appendChild(booleanSwitch); //or whatever..
break;
case "string": //..other stuff..
}
}
}
reflect(document);
这将为文档对象的每个可枚举布尔属性创建一个布尔开关。 单击此按钮时,它会更改文档的实际属性。