Смешанные пробелы JSLint и вкладки
Я запустил следующее через 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 & 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 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
Не уверен, как это исправить?
Ответы
Ответ 1
Эта ошибка возникает, когда ваш отступ использует комбинацию как пробелов, так и вкладок, например, {SPACE}{SPACE}{TAB}{SPACE}
или {TAB}{SPACE}{TAB}
. Я не уверен, почему это ошибка, а не предупреждение, но решение состоит в том, чтобы пересмотреть строку и убедиться, что вы используете только пробелы или вкладки.
Проблема со смешением вкладок и пробелов заключается в том, что вы можете запускать проблемы с отступом, когда файл просматривается в другом приложении. Например, один пользователь может иметь вкладки, настроенные на равные два пробела, другой может открыть первый пользовательский файл и увидеть неравномерный отступ, потому что два пробела плюс одна вкладка равна 6 пробелам, а не 4 в первом приложении. Использование того или другого обеспечивает лучшую читаемость вашего кода.
Интересно, что Qaru нормализует вкладки на 4 пробела, поэтому копирование и вставка кода здесь обратно в JSLint устраняет проблему.
Ответ 2
Вы также можете рассмотреть возможность использования опции "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. Я бы рекомендовал это. Большинство параметров являются общими между двумя инструментами.
Я также не использую вкладки. Когда-либо. Учитывая выбор, я парень с двумя пространствами.