LINUX.ORG.RU

Крокфорд захотел странного

 , ,


0

1

Я тут уже как-то писал о «глубоком понимании» сабжем жаваскрипта, которое он так любит себе приписывать. Еще одна вариация на эту тему. Он пишет в «good parts»:

Если функция не является свойством объекта, она вызывается как фунция (уже тут мы могли бы удивиться: а что, когда она является свойством объекта, она не вызывается как функция??? — ну ладно, возможно перевод неточен)...

Когда функция вызывается таким (каким, идиот?) способом, this связывается с глобальным объектом. Это ошибка в конструкции (имеется в виду — в дизайне, видимо, — косяк перевода) языка (O_o).

[Дальше вообще бомба]

Если бы Javascript был разработан правильно, то при вызове внутренней функции параметр this был бы по прежнему привязан к переменной this внешней функции. Следствием этой ошибки...

Дальше наш «эксперт дизайна языков», городит (очевидный, тащемта) велосипед, героически решая проблему проброса динамического контекста в замыкание через переменную.

Возьмем такой код:


f=function(){console.log(this.a); return function(){console.log(this.a)}}
ob={
a:1,
f:f
}

a=10

ob.f()()// 1 10

С чем он собрался связывать this ob.f()()? ведь this ни с чем не связан вообще, он динамически связывается в контексте вызова. В даном случае, вызов ob.f() связывает this c ob. Не может объектная система JS работать иначе, это бред сивой кобылы. Если он хочет, чтобы он связывался с лексическим контекстом, то чем его обычный лексический контекст не устраивает, нахрена ему тогда вообще этот this сдался?

Я тут уже как-то писал о «глубоком понимании» сабжем жаваскрипта, которое он так любит себе преписывать.

Признайся, ты специально так составил пост, чтобы посыпались шутки о анониймусе, который любит приписывать себе икспертные знания по всему на свете?

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

НЕ, лучше по делу. Ты уже лоханулся раз, пытаешься отыграться?

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

По делу мне лень, т.к. я не знаю яваскрипт. С твоей точки зрения весь ЛОР лоханулся с тобой и не один раз, так что я даже не знаю, стоит ли уточнять, в чем именно я опозорился.

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

т.к. я не знаю яваскрипт

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

anonimous ()

пристрелите его кто-нибудь

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

Заболело сзади? Подключи либу и не используй таймауты, все как рукой снимет.

anonymous ()

Ты не задумывался о том, чтобы завести собственный бложек? Формат же.

Deleted ()

О Господи! Какое глубокое понимания JS у нашего anonimous! Чувак, ты недостижимо крут! Пойдем к нам работать гуру JS?

anonymous ()

хочется странного

советую прекращать с веществами

Люди, даже умные, бывают неправы. И что? Напиши ему об этом. Трудности с английским? ССЗБ

Если тебе приносит удовольствие чувство восстановленной справедливости - иди бей алкашей во дворе.

reprimand ★★★★★ ()

Всё он правильно сказал. За 11 дней нельзя создать хороший язык. Конструкции вида var that = this — тому подтверждение.

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

Я не знаю, что там он правильно сказал, но он не понимает о чем он говорит. Он ахинею плетет.

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

иди бей алкашей во дворе.

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

anonymous ()

Если задуматься, единственное, что действительно раздражает - это передача global object в качестве this для функции в случае, если забыть 'use strict'. Для всего остального есть master card логическое объяснение.

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

Глобальный объект — это такой же объект, как и все остальные. Почему он должен вести себя иначе? Этот ваш use strict ломает семантику js на корню.

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

А покажи пример пожалуйста, а то не совсем понятно, о чем ты говоришь.

anonymous ()

писать на голом JS
2014

лал

anonymous ()

В даном случае, вызов ob.f() связывает this c ob. Не может объектная система JS работать иначе, это бред сивой кобылы.

Расскажи это придумавшим методы call, apply и bind, ага.

border-radius ()
Ответ на: комментарий от border-radius

f=function(){return this.a}
ob={
a:1
f=f
}
ob.f()
//это сахар для 
f.call(ob)

Или о чем ты вообще лепечешь? И ты call/apply в одну кучу с быдляцким bind не путай, это разные вещи.

anonymous ()

писал о «глубоком понимании»

А не ты ли тот анонимус с попоболью, который кидался на Vit

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

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

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

умолял модераторов комменты,

выпилить, конечно, имеется в виду

//fixed

anonymous ()
Ответ на: комментарий от anonymous
(function () {
    console.log('#1> ', this && 'wut?');
})();

(function () {
    var a = {
        foo: function () {
            console.log('#2> ', this && this !== a && 'wut?');
        }
    };

    ('LOL', a.foo)();
})();

(function () {
    console.log('#3> ', this && 'wut?');
}).call(null);
Corey ()
Ответ на: комментарий от anonymous

Этот ваш use strict ломает семантику js на корню

Совсем анонимус жирный пошел, сразу видно - зима близится...

Corey ()

Если бы Javascript был разработан правильно, то при вызове внутренней функции параметр this был бы по прежнему привязан к переменной this внешней функции.

Чел хотел замыкание... а получил овняшку :)

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

Все в порядке там с замыканиями. Хочешь замкнуть - будь добр, var self = this. А this выступает как вполне себе нормальный параметр функции, так же, как и в питоне self, прости г-споди. Если предохраняться использовать 'use strict', конечно же.

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

А может чел пришел из перла :) Вот в перле, если пишешь код на замыкание, так 100% его получишь. Я больше чем уверен, что описание для this описывает этот случай (является особой переменной). А чел просто не дочитал или забыл или забил болт на доки :)

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

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

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

так же, как и в питоне self

Если не ошибаюсь, self в питоне не вылазит в main (на языке js - global/window) namespace. Т.е. аналогичный код на питоне приведет к другому результату.

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

Чел хотел замыкание... а получил овняшку :)

Там и так есть замыкания, а для особо тормозных еще и bind запилили, который тоже хапает лексический контекст, фактически, только своеобразно. Он попутал хрен с пальцем просто.

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

является особой переменной

Все с точностью до наоборот. В JS по дефолту переменные лексические. Он является динамической переменной, точней динамически связывается с объектом в рантайме. Если бы этот придурок пришел из перла, он должен был бы понимать что такое динамический биндинг и не нести ахинею. Скорей из плюсов или жабы.

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

Eсли не ошибаюсь, self в питоне не вылазит в main (на языке js - global/window) namespace.

В strict mode тоже ничего никуда не вылазит :) Но питон более жестко следит за тем, что ты ему пытаешься засунуть в self, поэтому тут сравнивать тяжеловато.

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

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

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

function foo(a, b, c) {/*foo_body*/}
foo.call(CTX, A, B, C);

Примерно эквивалентно

(function () {
this = CTX;
a = A;
b = B;
c = C;

/*foo_body*/
})();
Corey ()
Ответ на: комментарий от Corey

Не буду разубеждать, пусть чуваки посмеются. Ты непони маешь не только this, ты не понимаешь даже, что такое замыкание. LOL. Превзошел самого Крокфррда.

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

В школе этого не преподают, не переживай так сильно. Спроси своего учителя информатики 1 сентября после линейки, может, повезет.

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

Че он нормально описал? Он пишет про лексические замыкания, а тебе толкуют за контекст вызова. Вторая ссылка — да, про это.

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

Тебя просили показать поведение use strict, достаточно было написать

(function () {
"use strict"
    console.log('this');
})();
Нахрена ты эти кружева наплел? Хочешь казаться умней, чем ты есть? Неудачно, судя по твоим последующим комментам, ты полный 0.

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

кавычки там не нужны, вокруг this, очепятался

//fixed

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

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

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

Ты даже не осилил понять

ты тоже

И напиши еще парочку примеров, не имеющих никакого отношения к теме, интересно же!

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

Даже беглый взгляд на твою ахинею показывает, что ты не понял, что ты написал. конструкция вида cjnsole.log(«foo»&&«bar»)всегда выводит последнее выражение, поэтому твои this там вообще бессмысленны. Дальше не смотрел.

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

всегда выводит последнее выражение

Ололошеньки

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

('LOL', a.foo)();

а это что означает? И при чем тут use strict?

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

Имелось в виду, если вся цепочка==true(hint: специально для медленных)

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

Нажми в своем браузере ф12 и выполни это сначала с use strict, а потом без него.

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

Да ты же тот самый великий мастер юзстрикта. Как я сразу не узнал.

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