Параметр функции JavaScript - Вопрос для начинающих - PullRequest
0 голосов
/ 06 октября 2018

Я новичок в JavaScript и пришел из Python.Мне трудно понять, откуда берется «прямоугольник» и как он передается в следующем скрипте (который я взял из tracking.js): любая помощь будет очень признательна, и я считаю, что этот вопрос, вероятно, также поможетлюбой другой, пришедший из Python.

<!doctype html>
<html>
<head>
  <meta charset="utf-8">
  <title>tracking.js - first tracking</title>
  <script src="../build/tracking-min.js"></script>
</head>
<body>
  <video id="myVideo" width="400" height="300" preload autoplay loop muted></video>
  <script>
  var colors = new tracking.ColorTracker(['magenta', 'cyan', 'yellow']);

  colors.on('track', function(event) {
    if (event.data.length === 0) {
      // No colors were detected in this frame.
    } else {
      event.data.forEach(function(rect) {
        console.log(rect.x, rect.y, rect.height, rect.width, rect.color);
      });
    }
  });

  tracking.track('#myVideo', colors);
  </script>
</body>
</html>

Ответы [ 3 ]

0 голосов
/ 06 октября 2018

Переменная rect представляет элемент в вашем массиве event.data.

Когда метод .forEach() вызывается для массива (event.data), этот метод выполняет внутреннюю итерацию каждого элемента массива и во время каждой итерации передает этот текущий элемент массива в функцию обратного вызова, котораяВы указываете, что в вашем случае является функцией:

function(rect) {
        console.log(rect.x, rect.y, rect.height, rect.width, rect.color);
}

Итак, rect является текущим элементом текущей итерации event.data.Надеюсь, это поможет!

0 голосов
/ 06 октября 2018

'rect' - это имя элемента, который вы возвращаете путем итерации с помощью forEach.Вы можете называть это как хотите, просто так случилось, что кто-то назвал это прямоугольным.

вы можете называть это как хотите

arr.forEach(name ()=> console.log(name))
arr.forEach(yourDogsName ()=> yourDogsName.height)
0 голосов
/ 06 октября 2018

Когда вы вызываете forEach для массива, код в forEach вызывает функцию, которую вы передаете ей «для каждой» записи в массиве, передавая запись в функцию (вместе с несколькими другими вещами).Таким образом, rect - это каждая запись в массиве по порядку.

Внутренне, не учитывая некоторые детали, forEach выглядит примерно так:

function forEach(callback) {
    // Here, `this` is the array `forEach` was called on
    for (let index = 0, len = this.length; index < len; ++index) {
        callback(this[index], index, this);
//               ^^^^^^^^^^^--- this is received by your callback as `rect`
    }
}

(одна из основных деталейЯ оставил для ясности forEach s thisArg и вызов callback с определенным значением this.)

Пример записи в журнал каждого шага:

function pseudoForEach(callback) {
    console.log("Start of pseudoForEach");
    for (let index = 0, len = this.length; index < len; ++index) {
        console.log(
            "Calling callback with: this[index] = " + this[index] +
            ", index = " + index + ", and this = (the array)"
        );
        callback(this[index], index, this);
    }
    console.log("End of pseudoForEach");
}

Object.defineProperty(Array.prototype, "pseudoForEach", {
    value: pseudoForEach,
    configurable: true,
    writable: true
});

var a = ["one", "two", "three"];
console.log("About to call pseudoForEach");
a.pseudoForEach(function(rect) {
    console.log("In callback, rect = " + rect);
});
console.log("Done with pseudoForEach call");
.as-console-wrapper {
  max-height: 100% !important;
}

I секунда Рекомендация Jaromanda X , MDN - хороший ресурс для информации JavaScript (и HTMLи CSS).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...