Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   JavaScript style guide, JSLint, Strict Warnings (https://javascript.ru/forum/offtopic/5633-javascript-style-guide-jslint-strict-warnings.html)

Dmitry A. Soshnikov 28.10.2009 18:46

Цитата:

Сообщение от Octane
Dmitry A. Soshnikov, можешь объяснить, почему и как работает такая конструкция: typeof X // "undefined", когда переменная X нигде не определена? Нормально ли так делать?

Нормально, это связано с грамматикой языка.

typeof (11.4.3, ES-3) - это рекурсивное UnaryExpression.

UnaryExpression :
  [...]
  typeof UnaryExpression
  [...]


Т.е. можно написать так:

alert(typeof typeof []); // string


Также, UnaryExpression в одном из нетерминалов распадается на PostfixExpression:

UnaryExpression : 
  PostfixExpression
  [...]


Далее, нетерминал PostfixExpression может содержать LeftHandSideExpression:

PostfixExpression :
  LeftHandSideExpression
  [...]


который, в свою очередь одним из нетерминалов имеет CallExpression.

LeftHandSideExpression :
  [...]
  CallExpression


CallExpression имеет у себя MemberExpression.

CallExpression :
  MemberExpression Arguments
  [...]


MemberExpression может содержать PrimaryExpression:

MemberExpression :
  PrimaryExpression
  [...]


А уже PrimaryExpression (наконец-то ;)) одним из своих нетерминалов имеет Identifier:

PrimaryExpression :
  [...]
  Identifier
  [...]


А дальше, работает обычное разрешение идентификаторов в Scope chain (10.1.4). И в этом случае будет возвращён объект типа Reference с базой null и именем свойства - "X". Главное здесь - база null, поскольку далее отрабатывает пункт (3) алгоритма typeof:

3. If GetBase(Result(1)) is null, return "undefined".

Цитата:

Сообщение от Octane
if(typeof addEventListener != "undefined") {…}

Цитата:

Сообщение от Octane
if(typeof window.addEventListener != "undefined") {…}

В обоих случаях работает разрешение имени идентификатора. Во втором случае ищется имя "window" и дальше вызывается [[Get]] по имени свойства "addEventListener", во первом случае ищется имя "addEventListener" без дополнительных доступов к свойствам.

Цитата:

Сообщение от Octane
if(window.addEventListener) {…}

Просто анализируется цепь прототипов на получение значения свойства. Если свойства нет, вернётся undefined.

Цитата:

Сообщение от Octane
if("addEventListener" in window) {…}

Анализируется цепь прототипов на наличие свойства. Данный случай предостерегает, если значение свойства будет false (проверка предыдущего примера не отработала бы).

Цитата:

Сообщение от Octane
А как лучше:

Логика работы известна - выбирай ;)

Octane 28.10.2009 19:54

Спасибо :)

alexKniaz 28.10.2009 21:32

Цитата:

Сообщение от B~Vladi (Сообщение 33739)
Мой стиль вы все прекрасно видели:)
Никаких пробелов, минимум переноса строк и скобок... Не завидую наследнику моего кода:D
Для таких ситуаций многие IDE имеют функцию форматирования. В DW для JS этого нет:(

Не понимаю людей, которые вставляют пробелы и переносы везде, где можно... Окно на весь экран, а смысла никакого не видно...

Читать большой код может быть неудобно.

Octane 01.11.2009 18:38

Начитался блин всяких style guide'ов и черновиков ECMAScript 5 :-E надо же всегда помнить про IE!

По новому стандарту ссылка arguments.callee не будет работать в "strict mode"; Решил попонтоваться и избавится он нее заранее следующим образом:
(function callee() {

    …

    if (…) {
        setTimeout(callee, …);
    }

}());
Но у нас же есть JScript, в котором такая функция будет видна и в текущем контексте исполнения:
(function callee() {});
alert(callee);


Цитата:

Сообщение от MDC JavaScript style quide
• Name inline functions, this makes it easier to debug them. Just assigning a function to a property doesn't name the function, you should to do this:
var offlineObserver = {
  observe: function OO_observe(aSubject, aTopic, aState) {
    if (aTopic == "network:offline-status-changed")
      setOfflineUI(aState == "offline");
  }
};

Ага, удобно значит дебажить, свойство name функции будет не пустой строкой, но в JScript этот OO_observe вывалится в глобальное пространство.

Вот и улучшили код)

Dmitry A. Soshnikov 01.11.2009 19:11

Цитата:

Сообщение от Octane
в JScript этот OO_observe вывалится в глобальное пространство.

Это ещё что! ;) Дальше - больше, JScript создаёт два объекта в этом случае:

var referenceToNFE = function testNFE() {
  alert('testNFE');
};
 
alert(referenceToNFE === testNFE); // false
 
referenceToNFE.newProperty = 10;
alert(testNFE.newProperty); // undefined
 
// однако, два объекта выполняют
// одинаковые действия
testNFE(); // "testNFE"
referenceToNFE(); // "testNFE"


Подробней.

Kolyaj 01.11.2009 21:25

А вот чем им, собственно, arguments.callee не угодил?

alexKniaz 12.11.2009 18:37

А чем им модель w3c не угодила Вот-вот. Её ведь в конце концов можно расширить и не превратив в модель Microsoft-а

subzey 29.11.2009 23:26

Цитата:

Сообщение от Kolyaj (Сообщение 34149)
А вот чем им, собственно, arguments.callee не угодил?

Присоединяюсь к вопросу. Кому, собственно, мешает arguments.callee?

GuardCat 04.10.2011 10:02

Назовёте некропостером... Но спрошу: почему в javascript используется чаще всего «египетский» стиль расставления фигурных скобок? Мне кажется читаемее (ну и слово) то есть читабельнее(ещё хуже) было бы как в Java/C/C++?

И если я пишу вот эдак:
function print(txt)
{
	document.write(txt,"<br>");
}
Это приемлемо?

Египетская сила =)

B~Vladi 04.10.2011 10:13

try
{
// Code
}
catch (e)
{
// Code
}

Так тоже читабельнее? Или так:
do
{
// Code
}
while ();


Имхо, код разрастается неоправдано.


Часовой пояс GMT +3, время: 08:19.