Что является причиной позади JSLint, говорящего, что существует “слишком много операторов var”

Мы можем загрузить большие файлы в контейнер Azure, используя Block blobs.

Block blobs состоят из блоков, каждый из которых идентифицируется идентификатором блока.

Когда мы загружаем блок в BLOB-объект, он связывается с указанным BLOB-объектом, но он не становится частью BLOB-объекта до тех пор, пока вы не передадите список блоков, включающий идентификатор нового блока.

Идентификаторы блоков - это строки одинаковой длины внутри большого двоичного объекта.

Блочный клиентский код обычно использует кодировку base-64 для нормализации строк равной длины. При использовании кодирования base-64 предварительно закодированная строка должна иметь длину не более 64 байтов.

Для получения дополнительной информации прочитайте документацию здесь .

Следующий код разбивает исходный файл на несколько байтовых массивов размером 10 МБ каждый. Каждый байтовый массив загружается в виде блоков с помощью операции Put Block . Эти блоки будут связаны с указанным Block blob.

Позже blockID идентифицируются с помощью операции Put Block List , которая создаст большой двоичный объект из загруженных блоков, используя blockID.

public string UploadFile(string sourceFilePath)
{
    try
    {
        string storageAccountConnectionString = "AZURE_CONNECTION_STRING";
        CloudStorageAccount StorageAccount = CloudStorageAccount.Parse(storageAccountConnectionString);
        CloudBlobClient BlobClient = StorageAccount.CreateCloudBlobClient();
        CloudBlobContainer Container = BlobClient.GetContainerReference("container-name");
        Container.CreateIfNotExists();
        CloudBlockBlob blob = Container.GetBlockBlobReference( Path.GetFileName(sourceFilePath) );
        HashSet blocklist = new HashSet();

        byte[] fileContent = File.ReadAllBytes(sourceFilePath);
        const int pageSizeInBytes = 10485760;
        long prevLastByte = 0;
        long bytesRemain = fileContent.Length;

        do
        {
            long bytesToCopy = Math.Min(bytesRemain, pageSizeInBytes);
            byte[] bytesToSend = new byte[bytesToCopy];
            Array.Copy(fileContent, prevLastByte, bytesToSend, 0, bytesToCopy);
            prevLastByte += bytesToCopy;
            bytesRemain -= bytesToCopy;

            //create blockId
            string blockId = Guid.NewGuid().ToString();
            string base64BlockId = Convert.ToBase64String(Encoding.UTF8.GetBytes(blockId));

            blob.PutBlock(
                base64BlockId,
                new MemoryStream(bytesToSend, true),
                null
                );

            blocklist.Add(base64BlockId);

        } while (bytesRemain > 0);

        //post blocklist
        blob.PutBlockList(blocklist);

        return "Success";
    }
    catch (Exception ex)
    {
        return ex.Message;
    }
}

63
задан slolife 4 October 2010 в 16:13
поделиться

6 ответов

Javascript не имеет области видимости блока. В других языках с ним (например, c), если вы объявляете переменную в операторе if, вы не можете получить к ней доступ за ее пределами, но в javascript вы можете. Автор JSLint считает, что это плохая практика, поскольку вы (или другие читатели) можете запутаться и подумать, что вы больше не можете получить доступ к переменной, но на самом деле можете. Поэтому вы должны объявить все свои переменные в верхней части функции.

98
ответ дан 24 November 2019 в 16:17
поделиться

Если для опции "onevar" установлено значение true, если разрешен только один оператор var для каждой функции.

if (funct['(onevar)'] && option.onevar) {
    warning("Too many var statements.");
}
3
ответ дан 24 November 2019 в 16:17
поделиться

Просто предположение, но это может быть время для функциональной декомпозиции , Функции должны делать одну вещь и делать это хорошо.

Слишком много переменных наводит на мысль о функции, которая пытается сделать слишком много. Или случай, когда вы должны использовать массив.

1
ответ дан 24 November 2019 в 16:17
поделиться

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

var x = arg + 1,
    y = cache.GetItem('xyz');

Измените его на:

var dimensions = {};
dimensions.x = arg + 1;
dimensons.y = cache.GetItem('xyz');
dimensions.request = ...

Затем вы можете получить доступ к этим переменным через объект, а лучше иметь один объект для каждой функции, чтобы содержать переменные этих функций. Тогда вы не получите предупреждения.

-6
ответ дан 24 November 2019 в 16:17
поделиться

Просто объявите свои вары в одном месте следующим образом:

var request,x,y;
6
ответ дан 24 November 2019 в 16:17
поделиться

Официальная причина здесь Дугласа Крокфорда.

Цитата:

Во многих языках блок вводит область видимости. Переменные, введенные в блок не виден за пределами блока.

В JavaScript блоки не вводят область видимости. Есть только функция-область. Переменная, введенная в любом месте функции, - это виден везде в функции. Блоки JavaScript сбивают с толку опытные программисты и приводят к ошибкам, потому что знакомый синтаксис дает ложное обещание.

JSLint ожидает блоков с функцией, if, switch, while, for, do и операторы try и нигде больше.

В языках с областью видимости блока обычно рекомендуется переменные должны быть объявлены на сайте первого использования. Но поскольку JavaScript не имеет области действия блока, разумнее объявить все функции переменные в верхней части функции. Рекомендуется, чтобы один Оператор var может использоваться для каждой функции. Это можно отклонить с помощью vars option.

28
ответ дан 24 November 2019 в 16:17
поделиться
Другие вопросы по тегам:

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