Ошибка смешанных пробелов и табуляции в JSLint - PullRequest
23 голосов
/ 11 августа 2010

Я выполнил следующее через JSLint:

$(document).ready(function() {

    /*
        Add paragraph on page load
    */

    // Get all header elements
    var header = document.getElementsByTagName('h1'),
        parent,
        newP,
        text;

    // Loop through the elements
    for (var i=0, m = header.length; i < m; i++) {
        parent = header[i].parentNode;
        newP = document.createElement("p");
        text = document.createTextNode('This paragraph was inserted with JavaScript!');
        newP.appendChild(text);
        // Insert the new P element after the header element in its parent node
        parent.insertBefore(newP, header[i].nextSibling);   
    }

    // so much easier with jQuery!
    //$('.section > h1').after('<p>I am a new paragraph &amp; I have been added to the page with javascript!</p>');

    /*
        Toggle show/hide
    */

    // display show/hide link - hidden by default if JS disabled as functionality is not available
    $('#content > .section > h2 > a').removeClass('hide');

    // hide What's new on page load - all content will be available if JS disabled  
    $('#content > .section > ul').addClass('hide');

    // show/hide content on click event
    $('#content > .section > h2 > a').live('click',function() {

        $('#content > .section > ul').toggle();

        return false;

    });

    /*
        JSON
    */

    var $jsonURL = 'scripts/response.json';

    $.ajax({
        type: 'GET',
        url: $jsonURL,
        dataType: "json",
        success: function(data){

            $.each(data.data, function(i, data){

                var $html = '';

                var $string = '';

                if (data.type == 'comment') {
                    $string = 'file';
                } else {
                    $string = 'workspace';
                }

                $html += '<li class="' + data.type + '">';

                $html += '<strong>New ' + data.type + '</strong> was added to the ' + $string + ' ';

                $html += '<a href="' + data.target + '">' + data.target + '</a> ';

                $html += '<a href="' + data.workspace + '">' + data.workspace + '</a>';

                $html += ' by <a href="#">' + data.user + '</a>'; 

                $html += '</li>';   

                $('#content > .section > ul').append($html);    

            });

        },
        error:function (xhr, ajaxOptions, thrownError){
            alert(xhr.status);
            alert(thrownError);
        }           
    }); 

});

И получаю эту ошибку:

Error:

Problem at line 89 character 4: Mixed spaces and tabs.

}

Implied global: $ 1,31,34,37,39,51,57,81, document 1,8,16,17, alert 87,88

Не совсем уверен, как исправить?

Ответы [ 2 ]

33 голосов
/ 11 августа 2010

Эта ошибка возникает, когда в вашем отступе используется комбинация пробелов и табуляций, например, {SPACE}{SPACE}{TAB}{SPACE} или {TAB}{SPACE}{TAB}. Я не совсем уверен, почему это ошибка, а не предупреждение, но решение состоит в том, чтобы вернуться к строке и убедиться, что вы используете только пробелы ИЛИ вкладки.

Проблема со смешиванием табуляции и пробелов заключается в том, что вы можете столкнуться с проблемами отступов при просмотре файла в другом приложении. Например, один пользователь может иметь вкладки, сконфигурированные так, чтобы они равнялись двум пробелам, другой может открыть файл первого пользователя и увидеть неравномерный отступ, потому что два пробела плюс одна вкладка равны 6 пробелам, а не 4 в приложении первого. Использование одного или другого обеспечивает лучшую читаемость вашего кода.

Интересно, что переполнение стека нормализует вкладки в 4 пробела, поэтому копирование и вставка кода отсюда обратно в JSLint решает проблему.

11 голосов
/ 20 апреля 2012

Вы можете также рассмотреть возможность использования опции «smarttabs», доступной в JSHint (JSHint - просто замена JSLint, просто лучше).

Эта статья действительно проницательна, объективно объясняет компромиссы, связанные с вкладкамиv пробелы (я даже не подозревал, что на эту тему можно сказать что-то еще), и демонстрирует, как должна вести себя логика умных вкладок:

http://www.emacswiki.org/emacs/SmartTabs

В основном, если вы используетеНа вкладках для «отступа» вы можете использовать пробелы для «выравнивания», если любые пробелы «используются только для выравнивания», т. е. что им предшествует правильное количество вкладок отступа:

Что делает этодопустимый фрагмент кода («---->» представляет собой TAB):

function foo() {
---->var a = 4,
---->    b = 5,
---->    c = 6;
}

Это можно сделать с помощью файла с именем '.jshintrc':

{
    "smarttabs": true
}

Или можноустановите его в исходном коде с комментарием:

/*jslint smarttabs:true */

Или вы можете просто полностью отказаться от вкладок ... (начинается религиозная война).

Лично я использую JSHint, который является производнымпроект JSLint сзначительно больше настраиваемости и тому подобное.Для большинства целей это один и тот же инструмент.http://jshint.com/docs/#options. Я бы порекомендовал это.Большинство параметров являются общими для двух инструментов.

Я также не использую вкладки.Когда-либо.Если бы у меня был выбор, я парень с двумя пробелами.

...