这里我简化了我的问题。我需要建一张桌子。我有3个具有特定功能的函数(一个,两个,三个),并且我有一个main函数,它从这3个函数的返回构建一个表。但是,我并不完全了解如何完成此任务。
function foo(one,two,three){
var result = "";
for (var i=0;i<arguments.length;i++){
result+= arguments[i](true);
result+= arguments[i](false);
}
console.log(result);
}
foo(one);
可能还有2个功能,但在这种情况下,我只编写一个功能并不重要。所以one()可以接受2个参数(true或false)和
function one(arg){
if(arg == true){
this.result += "1-true";
} else if(arg ==false){
this.result += "1-false";
}
return this.result;
}
答案 0 :(得分:0)
尝试更改功能一的条件:
var result = '';
if (arg) { .... } else { ... };
return ...;
答案 1 :(得分:0)
当你调用一个函数时,它不会从调用代码继承范围,因此this.result
函数中的属性one
不会与本地函数相同result
函数中的变量foo
。
除非将函数作为对象的方法调用,否则函数(this
)的上下文将是全局window
对象。 one
函数this.result
内部与window.result
相同。由于window
对象是全局上下文,因此您将创建一个名为result
的全局变量。
result
函数内声明的变量foo
是该函数的本地变量,它与全局result
变量分开。从one
函数中,您甚至无法访问result
函数中的foo
变量。
由于one
函数使用的是从未赋值的全局变量,因此它从一开始就包含undefined
。向其添加"1-true"
会将undefined
转换为字符串"undefined"
,结果为"undefined1-true"
。在下一次调用one
时,全局变量中的值仍然存在,因此它会向其添加"1-false"
,使其成为"undefined1-true1false"
。由于foo
函数会将第一次和第二次调用的值添加到one
,因此结果为"undefined1-trueundefined1-true1-false"
。
如果你在两个函数中使用全局变量,以便它们使用相同的变量(这是你试图做的),你会得到不同的结果。 one
函数会将"1-true"
添加到变量中,然后返回变量。然后foo
函数将返回的值添加到变量中,使其成为"1-true1-true"
。下一次调用one
会将"1-false"
添加到变量"1-true1-true1-false"
,然后返回变量的值,foo
函数会将该变量添加到变量中, "1-true1-true1-false1-true1-true1-false"
。
不是在两个函数中添加变量,而应该只从one
函数返回一个字符串,并将字符串放在foo
函数中:
function foo(one,two,three) {
var result = "";
for (var i = 0; i < arguments.length; i++) {
result += arguments[i](true);
result += arguments[i](false);
}
console.log(result);
}
foo(one);
function one(arg) {
if(arg == true) {
return "1-true";
} else if (arg == false) {
return "1-false";
}
}
注意:您可以使用if (arg == true)
而不是if (arg)
,而else if()
只能是else
:
function one(arg) {
if(arg) {
return "1-true";
} else {
return "1-false";
}
}
您还可以使用条件运算符来获得相同的结果:
function one(arg) {
return arg ? "1-true" : "1-false";
}
如果您仍想在one
函数中使用变量,则不需要使用+=
运算符,因为您只有一个字符串。您只需指定值:
function one(arg) {
var result;
if(arg) {
result = "1-true";
} else {
result = "1-false";
}
return result;
}
答案 2 :(得分:0)
感谢您的建议,考虑到上述所有答案,我找到了解决方案。
function foo(one, two,three) {
//Vehicle parts
var vhcparts = {
a: "cabin",
b: "wheel",
c: "body",
d: "trail",
e: "back",
f: "doublewheel",
g: "triplewheel",
h: "fourwheel",
i: "aftercabin",
j: "bodybegin"
}
//Final image string + 2chars, to add extra space at front and back;
var imageDescription = "aijbcccccccge" // obj.imageDescription;
imageDescription = "-" + imageDescription + "-";
//Iterate throught list of arguments to build specific line of TruckMainBoard
var result = "";
for (var i = 0; i < arguments.length; i++) {
result += "<tr>";
//Iterate throught image string to generate td and populate it
for (var j=0;j<imageDescription.length;j++){
// Verify if imageDescription string matches vhcparts(vehicle parts) array.
for (var p in vhcparts){
// var counter = 0;
if(imageDescription[j] == p
&&
(imageDescription[j] == "a" ||
imageDescription[j] == "b" ||
imageDescription[j] == "f" ||
imageDescription[j] == "g" ||
imageDescription[j] == "h"
)
)
{
result += arguments[i](true);
}
else if(imageDescription[j] == p) {
result += arguments[i](false);
}
}
}
result += "</tr>"
}
console.log(result);}
function one(arg){
var result = "";
if(arg){
result += '<td><img src="images/';
//result += vhcparts[p];
result +='.png">';
result +='</td>';
} else {
console.log("nothing to print")
}
return result;
}
foo(one,two);