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 сдался?



Последнее исправление: anonimous (всего исправлений: 2)

'use strict' --- всё исправляет...

как уже говорили выше..

(но я ещё и пример напишу :))

(function (global) {
    'use strict'
    
    var f = function () {
        console.log(this.a)
        
        return function () {
            //console.log(this.a) // TypeError: this is undefined
            console.log(global.a)
        }
    }

    var ob = {
        a: 1,
        f: f,
    }

    //a = 10 // ReferenceError: assignment to undeclared variable a
    global.a = 10

    ob.f()() // 1 10
})(this)
user_id_68054 ★★★★★
()
Последнее исправление: user_id_68054 (всего исправлений: 6)
Ответ на: комментарий от user_id_68054

Во первых, ты уверен что ты правильно понимаешь, что у тебя в коде происходит? Твой так называемый «global» никакого отношения к реальному глобалу не имеет, это просто произвольное имя для передачи контекста вызова.

a=100
ob={
a:1,
f:function(){
   return (function(global){console.log("THIS: "+this.a)
   return function(){console.log("GLOBAL: "+global.a)}}(this))
  }
}
ob.f()() 

//  THIS: 100
//  GLOBAL: 1
Во вторых, что вы привязались со своим use strict? Он никакого отношения к теме не имеет, и нет там никакой проблемы, и не было. Проблема в том, что крокфорд несет чушь, а хомячьё ведется, и, как следствие — уродуют язык нелепыми синтаксическими конструкциями.

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

Твой так называемый «global» никакого отношения к реальному глобалу не имеет

то есть — если я напишу

global.location = 'https://google.com'

то ни чего не произойдёт? :-)

например вот так:

(function (global) {
    'use strict'
    
    var f = function () {
        console.log(this.a)
        
        return function () {
            //console.log(this.a) // TypeError: this is undefined
            console.log(global.a)
        }
    }

    var ob = {
        a: 1,
        f: f,
    }

    //a = 10 // ReferenceError: assignment to undeclared variable a
    global.a = 10
    
    ob.f()() // 1 10
    
    global.location = 'https://google.com'
})(this)

даю подсказку:

global я использовал для того чтобы в режиме 'use strict' избежать ошибки «ReferenceError» для переменной a.

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

ну он может конечно и фигню сказал... :-)

(хотя от части я согласен с ним..)

но сказал он эту фигню без учёта 'use strict' --- и вот в этом оказался большой косяк. а сказал бы он тоже самое, но с учётом 'use strict', то я вообще бы с ним согласился бы! (хотя смотря что он сказал бы:))

...но ведь язык-то всё равно только улучшается (от версии к версии!).

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

то ни чего не произойдёт? :-)

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


ob={
loc: function(){return function(window){window.location="http://ya.ru"}(this)}
}
ob.loc()
alert(ob.location)

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

global я использовал для того чтобы в режиме 'use strict' избежать ошибки «ReferenceError» для переменной a.

Вот именно, что ты создаешь проблему этим use strict, а потом обходишь созданную тобой же проблему. А можно было бы не создавать и не обходить, а сделать все непосредственным образом.

anonimous
() автор топика

Похоже на дрочьбу вприсядку. А ТС пытается научиться дрочить по книжкам. Успехов!

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

Вот именно, что ты создаешь проблему этим use strict, а потом обходишь созданную тобой же проблему. А можно было бы не создавать и не обходить, а сделать все непосредственным образом.

ды нет же :-) ..

'use strict' указывает мне на проблемы, которые без 'use strict' было бы невидно (не заметно), но всё равно они оставались бы. :-)

применение 'use strict' — позволило добиться ясности: либо this.a либо global.a --- всё чётко и ясно

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

Если ты хапнешь контекст не из window

знаешь что .. иди в жопу.

пусть модераторы у меня скор отнимут (или другие санкции, более жестокие).. но зато я насладился этой секундой удовольствия посылания тебя..

пожалел что защёл в эту ветку.

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

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

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

;(function(){
"use strict"
window.a=1
})()
alert(a)
Так работает и в строгом и нестрогом режиме, явная передача контекста — это лишнее телодвижение. Насчет ноды только я не уверен, там могут быть заморочки, я до конца там не разобрался, как соотносятся var и глобал, они там, суки, начудили, будь здоров:)

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

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

anonimous
() автор топика

Что, тебе больше не доставляет твой онанизм с функциональными языками?

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

Только имбецилы типа тебя.

anonymous
()

Как узнать анонимного «анонимуса»: только он пишет жс-код без ";" :}

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