Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 28.10.2009, 18:46
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

Сообщение от 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
А как лучше:
Логика работы известна - выбирай
__________________
Тонкости ECMAScript

Последний раз редактировалось Dmitry A. Soshnikov, 28.10.2009 в 18:59.
Ответить с цитированием
  #12 (permalink)  
Старый 28.10.2009, 19:54
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Спасибо
Ответить с цитированием
  #13 (permalink)  
Старый 28.10.2009, 21:32
Профессор
Отправить личное сообщение для alexKniaz Посмотреть профиль Найти все сообщения от alexKniaz
 
Регистрация: 14.10.2008
Сообщений: 186

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

Не понимаю людей, которые вставляют пробелы и переносы везде, где можно... Окно на весь экран, а смысла никакого не видно...
Читать большой код может быть неудобно.
__________________
http://alexcoder.ucoz.ru - мой начинающийся сайт
Ответить с цитированием
  #14 (permalink)  
Старый 01.11.2009, 18:38
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Начитался блин всяких style guide'ов и черновиков ECMAScript 5 надо же всегда помнить про 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 вывалится в глобальное пространство.

Вот и улучшили код)
Ответить с цитированием
  #15 (permalink)  
Старый 01.11.2009, 19:11
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

Сообщение от 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"


Подробней.
__________________
Тонкости ECMAScript
Ответить с цитированием
  #16 (permalink)  
Старый 01.11.2009, 21:25
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

А вот чем им, собственно, arguments.callee не угодил?
Ответить с цитированием
  #17 (permalink)  
Старый 12.11.2009, 18:37
Профессор
Отправить личное сообщение для alexKniaz Посмотреть профиль Найти все сообщения от alexKniaz
 
Регистрация: 14.10.2008
Сообщений: 186

А чем им модель w3c не угодила Вот-вот. Её ведь в конце концов можно расширить и не превратив в модель Microsoft-а
__________________
http://alexcoder.ucoz.ru - мой начинающийся сайт
Ответить с цитированием
  #18 (permalink)  
Старый 29.11.2009, 23:26
Аватар для subzey
Пионэр
Отправить личное сообщение для subzey Посмотреть профиль Найти все сообщения от subzey
 
Регистрация: 16.11.2009
Сообщений: 1,322

Сообщение от Kolyaj Посмотреть сообщение
А вот чем им, собственно, arguments.callee не угодил?
Присоединяюсь к вопросу. Кому, собственно, мешает arguments.callee?
Ответить с цитированием
  #19 (permalink)  
Старый 04.10.2011, 10:02
Аватар для GuardCat
Просто любитель
Отправить личное сообщение для GuardCat Посмотреть профиль Найти все сообщения от GuardCat
 
Регистрация: 13.09.2011
Сообщений: 300

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

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

Египетская сила =)
Ответить с цитированием
  #20 (permalink)  
Старый 04.10.2011, 10:13
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,021

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

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


Имхо, код разрастается неоправдано.
__________________
Болтовня ничего не стоит. Покажите мне код. — Linus Torvalds
влад.куркин.рф

Последний раз редактировалось B~Vladi, 04.10.2011 в 10:16.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск