javascript和范围中的函数

时间:2015-07-31 10:36:29

标签: javascript function scope

这里我简化了我的问题。我需要建一张桌子。我有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;
}

3 个答案:

答案 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);