0kb Загрузка FTP (Cpanel на Windows Server) [дубликат]

tl; dr: Нет! Функции стрелок и декларации функций / выражения не являются эквивалентными и не могут быть заменены вслепую. Если функция, которую вы хотите заменить, not использует this, arguments и не вызывается с new, тогда да.


Как это часто бывает: это зависит. Функции Arrow имеют другое поведение, чем декларации / выражения функций, поэтому давайте сначала рассмотрим различия:

1. Функции Lexical this и arguments

не имеют собственных привязок this или arguments. Вместо этого эти идентификаторы разрешаются в лексической области, как и любая другая переменная. Это означает, что внутри функции стрелки this и arguments относятся к значениям this и arguments в окружающей среде, функция стрелки определена в (т.е. «снаружи» стрелка )

В случае выражения функции, this относится к объекту, который был создан внутри createObject. В функциональном случае стрелки this относится к this самого createObject.

Это делает функции стрелок полезными, если вам нужно получить доступ к this текущей среды:

// currently common pattern
var that = this;
getData(function(data) {
  that.data = data;
});

// better alternative with arrow functions
getData(data => {
  this.data = data;
});

Обратите внимание, что это также означает, что не можно установить функцию стрелки this с .bind или .call.

Если вы не очень знакомы с this, рассмотрим чтение

2. Функции стрелок не могут быть вызваны с помощью new

ES2015 различает функции, доступные call , и функции, которые являются конструкцией . Если функция конструируется, ее можно вызвать с помощью new, то есть new User(). Если функция является вызываемой, ее можно вызвать без new (т. Е. Вызов нормальной функции).

Функции, созданные посредством деклараций / выражений функций, являются конструктивными и вызываемыми. Функции стрелок (и методы) являются только вызываемыми. class конструкторы только конструктивны.

Если вы пытаетесь вызвать функцию, не вызываемую вызовом, или построить неконструируемую функцию, вы получите ошибку времени выполнения.


Зная это, мы можем указать следующее.

Сменный:

  • Функции, которые не используют this или arguments.
  • Функции, которые используются с .bind(this)

Не сменный:

  • Функции конструктора
  • Функция / методы, добавленные к прототипу (поскольку они обычно используют функции this)
  • Variadic (если они используют arguments (см. ниже))

Давайте рассмотрим это более подробно с помощью ваших примеров:

Функция конструктора

Это не будет работать, потому что функции стрелок нельзя вызвать с помощью new. Продолжайте использовать объявление / выражение функции или используйте class.

Способы прототипа

Скорее всего нет, потому что методы прототипа обычно используют this для доступа к экземпляру. Если они не используют this, вы можете его заменить. Однако, если вы в первую очередь заботитесь о сжатом синтаксисе, используйте class с его синтаксисом сжатого метода:

class User {
  constructor(name) {
    this.name = name;
  }

  getName() {
    return this.name;
  }
}

Методы объекта

Аналогично для методов в объектном литерале. Если метод хочет ссылаться на сам объект через this, продолжайте использовать функциональные выражения или используйте новый синтаксис метода:

const obj = {
  getName() {
    // ...
  },
};

Обратные вызовы

Это зависит. Вы должны обязательно заменить его, если вы наложили внешний this или используете .bind(this):

// old
setTimeout(function() {
  // ...
}.bind(this), 500);

// new
setTimeout(() => {
  // ...
}, 500);

Но: Если код, вызывающий обратный вызов, явно устанавливает this на определенное значение , как это часто бывает с обработчиками событий, особенно с jQuery, и обратный вызов использует this (или arguments), вы не можете использовать функцию стрелки!

Variadic функции

Поскольку функции стрелок не имеют собственных arguments, вы не можете просто заменить их функцией стрелки. Однако ES2015 вводит альтернативу использованию arguments: параметр rest .

// old
function sum() {
  let args = [].slice.call(arguments);
  // ...
}

// new
const sum = (...args) => {
  // ...
};

Связанный вопрос:

Дополнительные ресурсы:

7
задан Mikey C 2 April 2013 в 10:21
поделиться

3 ответа

Итак, я пишу этот ответ после проведения какого-либо расследования на моем FTP-сервере и чтения ссылки, которую вы предоставили elitehosts.com.

Я использую FTP-сервер FileZilla, и есть определенная настройка, которую я должен был ввести, чтобы она работала. В настройках сервера есть область под названием «Настройки пассивного режима». В этом диалоговом окне есть область под названием «Спецификация IPv4», и в этой области есть параметр «IP-адрес внешнего сервера для передачи пассивного режима:». Это набор выбора переключателей, и он был включен «По умолчанию», но поскольку FTP-сервер является NAT'ed, я изменил этот радиоприемник с «По умолчанию» на «Использовать следующий IP-адрес» и ввел в внешний IP-адрес адрес моего шлюза, предоставленный моим провайдером.

После того, как я установил это, это сработало! Не ужасно уверен, что ваш FTP-сервер NAT'ed, но я думал, что дам ответ на этот поток, потому что он кажется связанным.

1
ответ дан ariestav 19 August 2018 в 19:20
поделиться

FTP (S) использует случайные порты для настройки соединений данных ; частота прерывистого успеха указывает, что не все порты разрешены брандмауэром на клиентских и / или серверных машинах. Диапазон портов для входящих (PASV) соединений данных может быть установлен на FTP-сервере.

Эта страница имеет приятное резюме:

простой способ - просто разрешить FTP-серверам и клиентам неограниченный доступ через ваш брандмауэр, но если вы хотите ограничить их доступ к «известным» портам, вам нужно понять 4 разных сценария.

1) FTP серверу должно быть разрешено принимать TCP-соединения к порту 21 и устанавливать TCP-соединения из порта 20 в любой (удаленный эфемерный) порт.

2) FTP-серверу разрешено принимать TCP-соединения к порту 21 , AND также принимать TCP-соединения с любым эфемерным портом!

3) FTP-клиенту должно быть разрешено подключать TCP к порту 21 и принимать TCP-соединения из порта 20 в любой эфемерный порт.

4) FTP-клиенту должно быть разрешено подключать TCP к порту 21, а также устанавливать TCP-соединения на любой другой (удаленный эфемерный) порт!

3
ответ дан Cees Timmerman 19 August 2018 в 19:20
поделиться

В дополнение к ответам Cees, я запускаю vsftp на ec2 и должен был прокомментировать прослушивание_службы = YES, listen = YES, затем «service vsftpd restart».

Хотя в документации говорится, что он будет прослушивать ipv4 а также этого не было, и это решило проблему.

0
ответ дан Oliver Watts 19 August 2018 в 19:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: