JavaScript function.bind () поддерживается в листах Google? - PullRequest
1 голос
/ 07 января 2020

Вот простой код, который я пытаюсь запустить в скрипте листов Google. Целью является предоставление дополнительных параметров функции обратного вызова foreach.

function print(str, num) {
    Logger.log(str + ": " + num);
}

function test()
{
  var array = [1,2,3];
  var str = "Stam";
  //This line has an exception
  // TypeError: Cannot convert null to an object
  array.forEach(print.bind(null, str));
}
test();

Этот код основан на решении, описанном здесь .

Я знаю, что есть и другие решения, хотя я хочу понять, почему это не работает.

Я думаю, что, возможно, оно не поддерживается в листах Google.

1 Ответ

3 голосов
/ 08 января 2020

Как насчет этого ответа? Пожалуйста, подумайте об этом как об одном из нескольких возможных ответов.

При Javascript, когда используется null из bind(null, str), используется this. В Google Apps Script, когда null используется для bind(null, str), возникает ошибка типа «Невозможно преобразовать ноль в объект». Я думаю, что это может быть спецификацией Google. Я не уверен, будет ли это изменено в будущем обновлении. В качестве текущего обходного пути, как насчет использования this вместо null? Или, если вы хотите использовать bind(null, str) как null в строгом режиме, как насчет использования {} вместо null как bind({}, str)?

Кстати, я думаю, что test(); на последней строчке ваш скрипт можно удалить. Потому что в вашем случае, когда test() запускается в редакторе скриптов, test() запускается 2 раза test(); в последней строке. test(); в последней строке запускается как глобальный.

В приведенной выше ситуации, когда ваш скрипт изменяется, как насчет следующей модификации?

Измененный скрипт:

function print(str, num) {
  Logger.log(str + ": " + num);
}

function test() {
  var array = [1,2,3];
  var str = "Stam";
  array.forEach(print.bind(this, str));
}

или вы также можете изменить test() вашего скрипта следующим образом. Следующий test() возвращает тот же результат, что и выше 1.

function test() {
  var array = [1,2,3];
  var str = "Stam";
  array.forEach(function(e) {print(str, e)});
}

Результат:

Когда вы запускаете test() в редакторе сценариев, вы можете увидеть следующий результат в журнале .

Stam: 1
Stam: 2
Stam: 3

Ссылка:

Если я неправильно понял ваш вопрос и это Я не извиняюсь.

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