Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   Оператор запятая. Не возбраняется? (https://javascript.ru/forum/offtopic/43363-operator-zapyataya-ne-vozbranyaetsya.html)

danik.js 03.12.2013 03:05

Оператор запятая. Не возбраняется?
 
Короче, можно так писать?
this.getElement = function() {
    return this.$element || (this.$init(), this.$element);
};


Этот же код в традиционном стиле:
this.getElement = function() {
    if (!this.$element)
        this.$init();
    return this.$element;
};


Какой вариант лучше и нет ли проблем с запятой (где-то видел запятую как хак для установки scope чтоли (для eval'а в каком-то браузере) - так и не допер что делает эта запятая)?

danik.js 03.12.2013 03:16

И еще такой вариант:

function Bla() {
    this.getElement = function() {
        this.$init();
        delete this.getElement;
        return this.getElement();
    };
}

(function(){

this.$init = function() {
    this.$element = document.createElement("div");
};

this.getElement = function() {
    return this.$element;
};

}).call(Bla.prototype);


Насколько он оправдан?

Gozar 03.12.2013 03:25

Если сжимать код, могут быть проблемы. По крайней мере в 1 и 2 случае.

Maxmaxmaximus3 03.12.2013 03:36

и вообще это ужасный стиль и не очевидный, никогда так не делай

Gozar, кот, как тебе мой новый FRP стайл?
Все что объявлено без var попадает в $scope. Все что приравнивается в скобочках воспринимается как ячейка. Круто?


danik.js 03.12.2013 03:51

Цитата:

Сообщение от Maxmaxmaximus3
и вообще это ужасный стиль и не очевидный, никогда так не делай

А помоему прикольный. Там все в одну строчку, причем довольно короткую. Знак || воспринимается прекрасно, скобочки небольшие, последний элемент взглядом улавливается сразу.

Мне нравится. Неуж-то так плохо?

Третий вариант нигде не встречал. Но помоему логичный, но смотрится жутко, особенно delete.

Maxmaxmaximus3, убейся, пожалуйста.

Maxmaxmaximus3 03.12.2013 05:04

Цитата:

Сообщение от danik.js
Maxmaxmaximus3, убейся, пожалуйста.

В смысле?

monolithed 03.12.2013 13:09

Цитата:

Сообщение от danik.js
return this.$element || (this.$init(), this.$element);

Цитата:

Сообщение от danik.js
Короче, можно так писать?

alert(function() {
    return 0 || ('a', 'b');
}());

alert(function() {
    return 1 || ('a', 'b');
}());


Очевидно что нет.

Цитата:

Сообщение от danik.js
Какой вариант лучше

this.$element || this.$init()

ksa 03.12.2013 13:18

Цитата:

Сообщение от danik.js
можно так писать?

Писать-то можно по-разному... :) Главное чтобы другим потом понятно было.
тут же ведь используют вот это

alert((1,2,3,4,5));

Вопрос только в целесообразности этого... ;)

Цитата:

Сообщение от danik.js
нет ли проблем с запятой

Сама запятая тут не подведет... :no:

nerv_ 03.12.2013 13:19

Цитата:

Сообщение от danik.js
Короче, можно так писать?

если хочешь себя запутать, то пиши :)

function bar() {console.log('foo'); return 'foo';}
function foo() {console.log('bar'); return 'bar';}

var x = (bar(), foo());

alert(x);

ksa 03.12.2013 13:21

Цитата:

Сообщение от danik.js
так и не допер что делает эта запятая

Такой "набор" просто вернет последний элемент "перечня"...

nerv_ 03.12.2013 13:22

Цитата:

Сообщение от ksa
Такой "набор" просто вернет последний элемент "перечня"...

но пройдется по всем

ksa 03.12.2013 13:24

Цитата:

Сообщение от nerv_
если хочешь себя запутать

Про "запутывание"... :)

Много в каких языках могут применяться конструкции ну ооочень особенные! Во только оправдывает их повсеместное использование. Т.о. даже новички, не понимая их смысл, но зная "конечное" назначение применяют их правильно и к месту... :)
Может так будет и с запятой? Если начать ее применять всем поголовно для неких стандартных ситуаций... :D

ksa 03.12.2013 13:25

Цитата:

Сообщение от nerv_
но пройдется по всем

Разумеется. :yes:
Это-то в купе и начинают использовать. Т.е. выполнить последовательность выражений и вернуть результат последнего...

ksa 03.12.2013 13:29

Например вот это

function test(Val) {
   Val=Val||1;
};

Считается "стандартной" обработкой параметров функции, дабы придать им значение "по умолчанию"...

А это
<элемент>=<проверка_на_существование_элемента>||(<инициализация_элемента>,<элемент_по_умолчанию>);

кагбе "расширение" первой конструкции. :)

danik.js 03.12.2013 13:55

Цитата:

Сообщение от ksa
Сама запятая тут не подведет...

Вот, нашел тему, из-за которой у меня возникли сомнения:
http://stackoverflow.com/questions/9...-in-javascript

Кажется теперь понял тот трюк.

Цитата:

Сообщение от monolithed
this.$element || this.$init()

Поясню по поводу задачи, а то смотрю не все увидели, что я пытаюсь реазиловать ленивую инициализацию.

Суть в том, что изначально this.$element = null, и создаться он должен только при первом обращении к нему. Для этого нужно вызвать метод this.$init(). Причем $init() не должен ничего возвращать.

Есть идеи реализовать это иначе?

ksa 03.12.2013 14:01

Цитата:

Сообщение от danik.js
Есть идеи реализовать это иначе?

Самая короткая запись будет именно с "запятой"... :yes:

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

Gozar 03.12.2013 14:03

Цитата:

Сообщение от danik.js
Есть идеи реализовать это иначе?

Прикинь да?! Идея одна есть:

if (!this.$element) {
    this.$init();
}

return this.$element;

danik.js 03.12.2013 14:17

Цитата:

Сообщение от Gozar
Прикинь да?! Идея одна есть:

Не понимаю твоего юмора. Зачем ты выдаешь мой код за свою идею.

Gozar 03.12.2013 14:28

Цитата:

Сообщение от danik.js
Не понимаю твоего юмора. Зачем ты выдаешь мой код за свою идею.

Бывает...;)

l-liava-l 03.12.2013 14:59

Обычно так пишу, понятно и жмется
if (!this.$element) {
    this.$init();
}
return this.$element;


так реже, ибо немножко путает)
return this.$element || this.$div;

danik.js 06.12.2013 07:37

Законтрибьютил свой код. Сказали лучше исправить. Предложили нарушить это условие (это условие вобще придумал я):
Цитата:

Сообщение от danik.js
Причем $init() не должен ничего возвращать.

Просто не нравится такой вариант тем, что в другом "классе" метод $init() может создать два и более элементов и тогда такой шаблон кода уже не прокатит, и "однообразие" нарушится :)

cyber 06.12.2013 13:36

Цитата:

Сообщение от Gozar (Сообщение 284245)
Прикинь да?! Идея одна есть:

if (!this.$element) {
    this.$init();
}

return this.$element;

а так
!this.$element && this.$init();


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