有人能向我解释一下为什么我们在这个函数中需要一个for循环吗

Can somebody explain to me why we need a for loop in this function?

本文关键字:函数 循环 for 一个 为什么 解释 我们 一下      更新时间:2023-11-12

我对编程相对陌生,今天读了Eloquent Javascript这本书。我遇到了一个与整体范围有关的例子。然而,我更感兴趣的是了解它们提供的功能中的所有元素。

以下是功能:

var landscape = function () {
    var result = "";
    var flat = function (size) {
        for (var count = 0; count < size; count++)
            result += "_";
    };
    var mountain = function (size) {
        result += "/";
        for (var count = 0; count < size; count++)
            result += "'"
        result += "''"
    };
    flat(3);
    mountain(4);
    flat(6);
    mountain(1);
    return result;
};
console.log(landscape());

当我试图分解这个函数时,除了for循环外,我基本上理解了所有内容。我不确定为什么这个函数需要它们,我想知道是否有人愿意为我消化这个问题,并解释为什么我们需要循环来使函数正常工作。

现在您得到的输出是:

___/'''''______/''

如果没有它们,你会得到两个看起来像这样的函数(简化):

var flat = function(size){
    result += "_";
};
var mountain = function(size){
    result += "/'''";
};

因此,你会得到输出

_/''_/''

flat()size参数定义应输出多少下划线,mountainsize参数定义应输入多少单引号(')。

因此,你需要环,否则你会得到更小的山脉和平地。

考虑以下"图纸",其中F为"平面",M为"山脉":

___/'''''______/''
FFFMMMMMMFFFFFFMMM

每个山总是至少有3个字符长(因为它输出一个正斜杠,至少一个',然后是一个反斜杠)。这意味着上面的输出是(连同您的代码)

3 x F = 3 flats               | flats(3)
6 x M = (6 - 2) = 4 mountains | mountain(4)
6 x F = 6 flats               | flats(6)
3 x M = (3 - 2) = 1 mountain  | mountain(1)

重申:

// define an anonymous function with a "size" parameter and save it as "flat"
var flat = function (size) {
    // start "count" at 0 (count = 0) and add 1 to "count" (count++) while "count" is less than "size" (count < size)
    for (var count = 0; count < size; count++) {
        // Add an underscore to the "result" variable
        result += "_";
    }
};
// define an anonymous function with a "size" parameter and save it as "mountain"
var mountain = function (size) {
    // Add a forward slash to the "result" variable
    result += "/";
    // start "count" at 0 (count = 0) and add 1 to "count" (count++) while "count" is less than "size" (count < size)
    for (var count = 0; count < size; count++) {
        // Add a single quote to the "result" variable
        result += "'";
    }
    // Add a backwards slash to the "result" variable
    result += "''"
};

如果你问是因为

if (foo)
    bar();
oof();

对你来说似乎很奇怪,然后总是认为像这样的单行条件类似于

if (foo) {
    bar();
}
oof();

就像在另一个答案中所说的那样,for循环用于将字符连接指定次数。我想指出的是,你不需要for循环来制作你的"平面"answers"山脉"。

jsfiddle演示

var landscape = function () {
    var result = "";
    var flat = function (size) {
         result += Array(size+1).join("_");
    };
    var mountain = function (size) {
        result += "/";
        result += Array(size+1).join("'");
        result += "''";
    };
    flat(3);
    mountain(4);
    flat(6);
    mountain(1);
    return result;
};
console.log(landscape());