LINUX.ORG.RU

за что мы любим javascript

 


0

1
for(var j = 0; j < 3; j++) {
  console.log('j1 %s', j)
  for(var j = 0; j < 3; j++) {
    console.log('j2 %s', j)
  }
}



результат

j1 0
j2 0
j2 1
j2 2


В общем то я уже давно знаю что javascript так не умеет. И когда встретил неожиданное поведение, наверное и минуты не потратил... но как то осадочек.

★★★★★
Ответ на: комментарий от Vit

Если ты всё понял и считаешь это нормой, тут спорить бессмысленно. Про let (вернее про то что он везде поддерживается) я действительно не знал, поскольку уже 2 года не интересуюсь новшествами в яваскрипте.

Но я это нормой не считаю и причин не понимаю (не в историческом смысле, а в том смысле почему оно так сейчас). По-моему, с появлением let можно было сделать var деприкейтед. Пример анонимуса меня не сильно впечатлил, честно говоря, а других примеров для var не было.

Так что что именно ты понимаешь под «всё объяснили» я тоже честно говоря не совсем улавливаю. Если «историю вопроса» - то спасибо конечно, но это ничего не меняет.

AndreyKl ★★★★★
() автор топика
Последнее исправление: AndreyKl (всего исправлений: 3)
Ответ на: комментарий от AndreyKl

По-моему, с появлением let можно было сделать var деприкейтед

Что еще раз доказывает твою умственную отсталость.

anonymous
()
Ответ на: комментарий от anonymous

Можешь привести пример кода где это нужно? Ну то есть хотя бы учебный упрощённый пример где бы это работало?

Не в том смысле работало что «сработало», а в том что по другому либо нельзя, либо сильно неудобнее.

AndreyKl ★★★★★
() автор топика
Последнее исправление: AndreyKl (всего исправлений: 1)
Ответ на: комментарий от AndreyKl

Про let (вернее про то что он везде поддерживается) я действительно не знал, поскольку уже 2 года не интересуюсь новшествами в яваскрипте.

Оффтопну. Сам не фанат JavaScript-а, но так как стали появляться примеры кода, которые я перестал понимать СОВСЕМ (spread operator и т.п.) - решил, что пора таки осилить новые вещи. В итоге купил (за 300 рублей) в электронном виде книжку Книга «ES6 и не только» - https://habrahabr.ru/company/piter/blog/309298/

Книгу очень рекомендую (хотя есть и статьи и всё такое - но мне надо было быстро войти в курс дела - времени на перелопачивание разрозненной информации тогда не было). Кто хочет - может купить, кто не хочет - может скачать (гугл в помощь). Можно даже сначала скачать и прочитать - если посчитаешь для себя полезным - купить (в качестве «спасибо» издательству). Не сочтите за рекламу (или сочтите :) ) Топикстартеру, наверное, не актуально (ибо TypeScript), а кому-нить может и пригодится.

Qasta
()
Ответ на: комментарий от AndreyKl

eslint позволяет выпилить любое количество устаревших фич. В том числе и var, если хочется. Просто надо рассматривать яваскрипт обязательно в паре с линтером. Это может казаться странным, но это работает и решает все детсадовские проблемы.

Так что что именно ты понимаешь под «всё объяснили» я тоже честно говоря не совсем улавливаю.

Тебе сказали:

1. Что есть let. 2. Что линтер ругнется на вложенные переменные. 3. Что можно в линтере запретить var.

То есть что в современной разработке такой проблемы приключиться не может.

Vit ★★★★★
()
Последнее исправление: Vit (всего исправлений: 1)
Ответ на: комментарий от AndreyKl

И да, я сразу сказал что я знаю о том как оно себя ведёт. Но когда пишешь - бывает забываешь, из за того что пишешь не только на яваскрипте.

Там самый смак когда в цикле создаешь замыкания, забывая, что у нас тут такой недоязычок. И вот что сделал бы вменяемый рантайм? Орал бы: вот тут повторное объявление, ошибка! Ну как минимум. Но у нас же наркоманский недоязычок, поэтому ему все пох.

bread
()
Ответ на: комментарий от AndreyKl
function someFunction(){
    if(debugFlag) var someVariableOutOfScope = someVariableOutOfScopeDebugProxy

    ...some code....

}

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

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

Ты дурак. Весьма скудоумный.

anonymous
()
Ответ на: комментарий от anonymous

Можешь продолжить пример пожалуйста, а то я не совсем понял как этим пользоваться.

А в том, что ты не понимаешь, что депрекейтить подобные вещи в вебе нельзя.

Ну и да, чем помешал бы варнинг в консоли «юзинг деприкейтед фиче, лайн такая то?»

Это вообще то по моему стандартная практика, приходят изменения, что то становится деприкейтед. Я ж не сказал «выпилить». Или ты столь зелен, мой юный падаван, что не отличаешь «объявить деприкейдет» и «выпилить»?

AndreyKl ★★★★★
() автор топика
Последнее исправление: AndreyKl (всего исправлений: 1)
Ответ на: комментарий от AndreyKl

я не совсем понял как этим пользоваться.

Подменить глобальную переменную в функции на переменную из дебаг-контекста по условию.

Туда нельзя вставить let, т.к. в таком случае у неё область видимости будет только в if{} блоке.

Tanger ★★★★★
()
Ответ на: комментарий от bread

Но у нас же наркоманский недоязычок, поэтому ему все пох.

Спорить сложно. Многие вещи уже давно можно было бы изменить, не меняя совместимости со старыми скриптами, например, банально выдавая варнинги.

AndreyKl ★★★★★
() автор топика
Ответ на: комментарий от Tanger

И всё таки, можно пример использования? я не пойму как потом этим пользоваться то?

т.е. я бы сделал что то вроде, навскидку (хотя вероятно я бы так не делал, просто это единственное как я вижу применение того о чём вы говорите, но если это то - то у вас убого до крайности).

function myF() {
  let debugTrace = function(){}

  if(debug) debugTrace = globalDebugTrace

  ...

  debugTrace(someValue)

  ...
}

AndreyKl ★★★★★
() автор топика
Последнее исправление: AndreyKl (всего исправлений: 1)
Ответ на: комментарий от AndreyKl

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

Просто это не deprecated. Почему ты считаешь, что function-scope должно быть deprecated? Анонимус привел пример использования. Зачем ему видеть ворнинги, когда он делает все правильно?

Если ты используешь исключительно block-scope переменные, как писали выше - использую линтер и настрой его чтобы кидал ворнинги на var.

Tanger ★★★★★
()
Ответ на: комментарий от Tanger

Почему ты считаешь, что function-scope должно быть deprecated?

Потому что это непоследовательно. Я уже объяснил дважды. Последний раз вот здесь за что мы любим javascript (комментарий) .

Анонимус привел пример использования.

какой такой пример?

AndreyKl ★★★★★
() автор топика
Последнее исправление: AndreyKl (всего исправлений: 2)
Ответ на: комментарий от Vit

1. Что есть let. 2. Что линтер ругнется на вложенные переменные. 3. Что можно в линтере запретить var.

Понимаешь, вит, то что идрис можно скомпилять в яваскрипт, никак к делу не относиться. А по твоей логике выходит что я должен считать яваскрипт - хорошим продуманным инструментом потому что к нему есть idris. Но это вообще то тупняк, уж прости.

AndreyKl ★★★★★
() автор топика
Ответ на: комментарий от AndreyKl
function initNextPrevKeys() {
    $script.ready("plugins", function() {
        $(function() {
            function a(b) {
                if (b && b.href) {
                    document.location = b.href
                }
            }
            if (typeof jQuery.hotkeys !== "undefined") {
                $(document).bind("keydown", {
                    combi: "Ctrl+left",
                    disableInInput: true
                }, function() {
                    a(document.getElementById("PrevLink"))
                });
                $(document).bind("keydown", {
                    combi: "Ctrl+right",
                    disableInInput: true
                }, function() {
                    a(document.getElementById("NextLink"))
                })
            }
        })
    })
}

Сделай так, чтобы любое обращение к document в данной функции было бы обращением к documentProxyDebug, при включенном флаге debugFlag. И так чтобы тебе не пришлось рефакторить всю функцию, изменяя везде обращение к out of scope document

Пример с var - это одна строчка, которая добавляется в любую функцию на этапе дебага и удалится после. При этом подмена document на прокси-объект произойдет прозрачно.

function initNextPrevKeys() {
    if(debug) var document = documentProxy;
    $script.ready("plugins", function() {
        $(function() {
            function a(b) {
                if (b && b.href) {
                    document.location = b.href
                }
            }
            if (typeof jQuery.hotkeys !== "undefined") {
                $(document).bind("keydown", {
                    combi: "Ctrl+left",
                    disableInInput: true
                }, function() {
                    a(document.getElementById("PrevLink"))
                });
                $(document).bind("keydown", {
                    combi: "Ctrl+right",
                    disableInInput: true
                }, function() {
                    a(document.getElementById("NextLink"))
                })
            }
        })
    })
}
anonymous
()
Ответ на: комментарий от bread

Еще один скудоумный. Ну,а если тебе надо запроксить не document, а какую-то переменную из верхнего скоупа, к которой ты не получишь доступы как window.document

Долго будем маневрировать не понимая принципа возмодности объвить переменнную вне блочного скоупа? Представьте, иногда это может быть нужно и даже очень полезно .

anonymous
()
Ответ на: комментарий от anonymous

Спасибо за пояснение.

В целом весьма неоднозначный способ, я бы не пользовался. Глобальная переменная, в зависимости от параметра становится локальной или нет.

Для этих целей давным давно придуман гораздо более гибкий и удобный DI . На крайняк можно написать глобальную функцию и
объявлять локальную переменную.

function getDocument() {
  return debug ? documentProxy : document
}

function myFunc() {
  let document = getDocument()

  ...

  document.location = href

  ...
}
Описанное тобой применение вар на мой взгляд точно не стоит того чтобы иметь лишний, с весьма неочевидным поведением, способ объявления.

За пример спасибо, вообще то это даже идиоматично раньше было. Но я лично давно не встречал (правда, как я говорил, уже года два не интересуюсь, но пропало по моему раньше).

AndreyKl ★★★★★
() автор топика
Последнее исправление: AndreyKl (всего исправлений: 2)
Ответ на: комментарий от bread

Вангуб, что следубшим решением будет

let tmp = originalVariable
let variable = debug ? variableProxy : originalVariable

Потому что вы необучаемы. И будете выдумывать все больше и больше кода для вещей, которые можно решить более просто.

anonymous
()
Ответ на: комментарий от anonymous

Да я вообще жс не знаю, не нервничай так. Но другие языки как то обходятся без специального function-wide объявления, и ниче. А вы там из носа козюльки выковыриваете и рассматриваете зачем бы оно пригодилось. Хотя это явный косяк дизайна, самими писателями языка исправленный.

bread
()
Ответ на: комментарий от anonymous

Долго будем маневрировать не понимая принципа возмодности объвить переменнную вне блочного скоупа? Представьте, иногда это может быть нужно и даже очень полезно .

это «нужно и очень полезно», только для «мамкиных программистов». Взрослые люди пользуют ДИ или хотя бы фукнции объявляют. А так честно говоря довольно слабый код.

AndreyKl ★★★★★
() автор топика
Ответ на: комментарий от AndreyKl

getDocument

Ну, а теперь - ты дебажишь чужой код, на несколько тысяч строк, и проксить тебе надо несколько переменных. Будешь отдельно каждую gteVariable() писать?

Да, ладно. Пример с дебагом - это синтетика. Как и любой пример придуманный тут. Просто вы не понимаете, что объявить переменную на уровне лексической области видимости бывает нужно.

Что есть еще метапрограммирование и eval. Что есть динамическая подгрузка кода и исполнение его в произвольных контекстах, которые надо перегружать.

Вы просите примеров чтобы вам что-то доказать, но не понимаете сути на синтетике в пару строк. Вам надо показывать примеры на сотни строк, чтобы открыть вам глаза. Потому что ты не умеешь думать. Ты идиот.

anonymous
()
Ответ на: комментарий от anonymous

И будете выдумывать все больше и больше кода

Две строчки? Жуткий оверхед. Ты посмотри лучше на свою лапшу в обработчиках, это ж песец. Ну я знаю, что у вас это норма, но глаза кровоточат же.

bread
()
Последнее исправление: bread (всего исправлений: 1)
Ответ на: комментарий от bread

Ты посмотри лучше на свою лапшу в обработчиках, это ж песец

Это не моя лапша, это код ЛОРа, маня.

anonymous
()
Ответ на: комментарий от AndreyKl

Я сказал ровно то что было написано - пример из первого поста не актуален, т.к. ты не владеешь вопросом. О том, чем ты должен считать яваскрипт речи не было, т.к. мне нет дела до твоих душевных метаний. Сейчас ты занимаешься демагогией, приписывая другим собственные фантазии.

Vit ★★★★★
()
Ответ на: комментарий от anonymous

Ну, а теперь - ты дебажишь чужой код, на несколько тысяч строк, и проксить тебе надо несколько переменных. Будешь отдельно каждую gteVariable() писать?

Вероятнее всего да, DI буду использовать, я ведь сказал.

Вы просите примеров чтобы вам что-то доказать, но не понимаете сути на синтетике в пару строк.

Да нет, мы вполне поняли суть. Просто для этого пользуются DI.

AndreyKl ★★★★★
() автор топика
Ответ на: комментарий от Vit

Спасибо что пояснил. Думаю, наш с тобой разговор можно считать завершённым. За сим раскланиваюсь.

AndreyKl ★★★★★
() автор топика
Ответ на: комментарий от AndreyKl

Я же написал, что объявление переменнойна уровни лексического скоупа, а не блочного, может применяться и для иных вещей, где твой DI не поможет никак.

Ладно. Ты слишком глуп. Счастливо оставаться.

anonymous
()
Ответ на: комментарий от anonymous

Я же написал, что объявление переменнойна уровни лексического скоупа, а не блочного, может применяться и для иных вещей, где твой DI не поможет никак.

Вон, посмотри как в ангуляре DI применяется. Очень удобно, твой убогий скоуп рядом не валялся. Зачем костыли если есть современный удобный инструмент?

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

Пример а-ля ангуляр 1.х, по памяти:

DIservice.createObject(function(document) {
 return {
   method1: function(a, b) {
     ...

     document.location.assign(href)

     ...
   }
 }
})

ну а DIService конфигуряется вначале. потом поставляет нужные нистансы в создаваемые объекты через параметры функций-конструкторов.

AndreyKl ★★★★★
() автор топика
Последнее исправление: AndreyKl (всего исправлений: 5)
Ответ на: комментарий от anonymous

Покажи это. А то попусту гавкать любой может.

Приведи примеры о которых ты говоришь, где без скоупа всё усложняется значительно и ничего ен упрощается.

Пока что ты такого примера не привел. Значит ты у нас мамкин программист.

AndreyKl ★★★★★
() автор топика
Ответ на: комментарий от AndreyKl

Причём с ДИ все параметры всегда заданы явно как параметры функций, что считается хорошим стилем. В отличие от использования глобальных переменных.

AndreyKl ★★★★★
() автор топика
Ответ на: комментарий от AndreyKl

Можешь попробовать реализовать деструктурирующее присваивание в рантайме, без использования var, например.

int64
()
Ответ на: комментарий от int64

в смысле var a, b = [1, 2] ?

ну это знаешь уже вопросы реализации - поверх чего и как реализовывать синтаксический сахар. Я конечно допускаю что яваскрипт там может иметь какие то особенности, благодаря которым вот прям без вар никак не обойтись, но я с той же вероятностью допускаю что это такое же криворучие как и упорно молчать при повторном объявлении переменной в том же скоупе.

PS. ну и емнип в Scala деструктивное присваивание есть, а скоуп блочный, т.е. по крайней мере там это как то реализовали, в терминах «без вар».

AndreyKl ★★★★★
() автор топика
Последнее исправление: AndreyKl (всего исправлений: 1)
Ответ на: комментарий от AndreyKl

Он и у ES блочный.

Ты реализуй десткруктинг для окружений, которые его еще не поддерживают. Для ES5, например.

В общем говоря, как уже выше по треду отметили, ты слишком много на себя берешь. И слишком самоуверен. Эффект Даннинга-Крюгера налицо.

int64
()
Ответ на: комментарий от int64

Ты реализуй десткруктинг для окружений, которые его еще не поддерживают. Для ES5, например.

Вообще не понял, зачем мне для ES5 реализовывать деструктивное присваивание?

Т.е. всё хорошо, но что ты имеешь ввиду? ну неподдерживают , так они много чего не поддерживают. Реализуй вон зависимые типы для ES5? Или для ES6.

Что за бред?

Если ты про «а там можно накостылять» то мне пофиг, я уже накостылялся. И своё наследование реализовывал, и фреймворк на пхп писал, спасибо, я пас.

Ещё аргументы будут?

AndreyKl ★★★★★
() автор топика
Последнее исправление: AndreyKl (всего исправлений: 4)
Ответ на: комментарий от int64

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

Но я ведь просил конкретный пример. Причём такой, который бы был действительно нужен. И при этом не был откровенным говнокодом (как в случае с «деструктивным присваиванием на ES5», если я верно тебя понял).

Т.е. ты пример приводи. Вон анонимус привел, но только ДИ это лучше решает. А других он не привёл, к сожалению.

Ты приведи, поглядим, обсудим.

Кстати, полагаю что анонимус просто не пользовался DI, ни в ангуляре, ни в спринге, ни в скале. Ни где бы то ни было ещё. Вот и держиться за свой скоуп как за писаную торбу.

AndreyKl ★★★★★
() автор топика
Последнее исправление: AndreyKl (всего исправлений: 3)
Ответ на: комментарий от int64

Если объяснение сводится к тому что мне нужно каличным способом реализовывать фичи которые по каким то причинам довольно долго не могли дойти до яваскрипта - то да, абсолютно нет смысла. Я тебе сказал я уже наследование реализовывал. Я этой «гибкостью» (а на самом деле самоделкинством) сыт по горло. Кушай её сам. Я считаю это недостатком, а не достоинством.

AndreyKl ★★★★★
() автор топика
Последнее исправление: AndreyKl (всего исправлений: 2)
Ответ на: комментарий от AndreyKl

Вообще не понял, зачем мне для ES5 реализовывать деструктивное присваивание?

Сначала персонаж говорил о деструктурировании, а не о каком-то «деструктинге» // мимокрокодил

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Вообще, да. Но так как я человек тёмный и не знаю что такое дестурктурирование, то мне показалось больше всего похожим на деструктивное присваивание. Ну похоже угадал, ибо он что то замолк, а там бог его, он не особо затрудняет себя объяснениями.

AndreyKl ★★★★★
() автор топика
Последнее исправление: AndreyKl (всего исправлений: 1)
Ответ на: комментарий от AndreyKl

Ну вот возьми свой DI и задачу, что описывал прежде анонимус.
Только теперь debug - это объект, поля которого декларируют какие переменные перегружать.

function ololo() {
    if(debug) {
       перегрузить все переменные в лексической области видимости ololo указанные полями в debug значениями этих полей
    }
}


Раз ты так любишь требовать примеров, ну, продемонстируй пример со своим DI. На ванильном js с использованием var это решается в одну строчку.

int64
()
Ответ на: комментарий от int64

Спасибо за пример.

Я вероятно просто не клал бы переменные в скоуп, а пользовался бы this или завёл объект отдельный. Правда, не совсем понял при чём тут DI. Оно в общем и так решается в «одну строчку».

var o = {'a': 1, 'b': 2}

for(var i in debug) {
  o[i] = debug[i]
  // или this[i] = debug[i]
}

// ну или "на jquery" $.extend(this, debug) :)

console.log("o.a %s, o.b %s", o.a, o.b)
// console.log("this.a %s, this.b %s", this.a, this.b)
Хотя это удлинило бы название, да.

Я своё отношение к этому делу уже высказывал, повторяться не буду.

Но в общем, спасибо за примеры тебе и анонимусу. Вы меня убедили в итоге. Т.е. не то что бы я согласен что это прям мега фича, и даже всё ещё думаю что это ошибка при проектировании языка. Но я начинаю понимать о чём идёт речь: существует ряд техник, которые в общем используются именно так и никуда от этого не деться. И действительно, «отменять» вар вряд ли имеет смысл, ведь похоже довольно много людей которые так или иначе этими техниками пользуется. Кто чем. Надо действительно просто его не использовать, тем более раз уж есть лет.

Благодарю за конструктивную беседу.

Тема закрыта. Яваскрипт мы любим в том числе и за это, но теперь еще сильнее, ибо это действительно вряд ли поправимо.

AndreyKl ★★★★★
() автор топика
Последнее исправление: AndreyKl (всего исправлений: 4)
Ответ на: комментарий от AndreyKl

Лол. Но ты ведь либо невнимательный, либо что.
Было же оговорено прежде, что ты дебажишь уже написанный кем-то ранее код. У тебя есть несколько вариантов - либо рефакторить его, переписывая все вызовы внешних переменных на обращения как к свойству объекта, либо везде расставлять брейкпоинты и пошагово выполнять код, либо аналогично printfить, либо же написать одну строчку в начале нужной функции и динамиечски по флагу проксировать вызовы чего укажешь.

Очень удобно говорить о ненужности чего угодно, аперируя аргументами, что это надо\можно написать иначе. Такие аргументы есть ни что иное как манямирок.

int64
()
Ответ на: комментарий от AndreyKl

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

На каждую область видимость интерпретатор создает объект.
В те времена, было нерационально делать такой оверхед, в такой вещи как браузер.

int64
()
Ответ на: комментарий от AndreyKl

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

Его просили сделать язык, на котором бы писали обычные пользователи, дизайнеры, а не программисты. Который бы помогал автоматизировать что-либо, а не выстраивать архитектуры. И он прекрасно справился со своей задачей.

И когда вы пишешете о том, что «создатели языка сами осознали и исправили» - вы несете такую ужасную чепуху. Начиная с того, что уже давно нет никаких «создателей» языка, сам Айк не принимает участие в его разработке, все пилится сообществом (да-да, вы сами можете предложить что-либо), вся разработка спек ведется в публичных репозиториях. И заканчивая тем, что завозить что-либо в язык начали тогда, когда это понадобилось применять язык для чего-то большего, чем автоматизация формочек.

Какие к черту типы, компиляция, и что там еще просят нытики. Если бы все о чем просят они было бы в языке изначально, он бы не был столь гибким, чтобы к нему можно было прикрутить что угодно сверху, когда понадобится. И прикрутить необязательно спекой, а начиная от транспайлеров, заканчивая динамическим метапрограммирование и патчингом самой объектой системы.

int64
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.