Объединение socket.io с JQuery: can not access $ (this) [duplicate]

Когда вы пишете:

SomeObject s1 = new SomeObject("first");

s1 не является SomeObject. Это ссылка на объект SomeObject.

Следовательно, если вы назначаете s2 в s1, вы просто назначаете ссылки / дескрипторы, а базовый объект тот же. Это важно в Java. Все передается по значению, но вы никогда не пропускаете объекты вокруг - только ссылки на объекты.

Поэтому, когда вы назначаете s1 = s2, а затем вызываете метод на s2, который меняет объект, базовый объект изменяется, и это видно, когда вы ссылаетесь на объект через s1.

Это один из аргументов для неизменяемости в объектах. Делая объекты неизменными, они не будут меняться под вами и, таким образом, будут вести себя более предикативно. Если вы хотите скопировать объект, самым простым / наиболее практичным методом является написать метод copy(), который просто создает новую версию и копирует ее по полям. Вы можете делать умные копии с использованием сериализации / отражения и т. Д., Но это более сложно, очевидно.

3
задан Kishan Patel 22 April 2017 в 11:34
поделиться

1 ответ

Функции стрелок не привязывают this. В соответствии с MDN:

Отсутствие привязки этого

До тех пор, пока функции стрелок, каждая новая функция не определила свое собственное значение this (новый объект в случае конструктора, undefined в строгом режиме вызовы функций, объект контекста, если функция вызывается как «метод объекта» и т. д.). Это оказалось раздражающим объектно-ориентированным стилем программирования.

Таким образом, this в вашем примере будет глобальным объектом window, который, по-видимому, не имеет свойства, называемого x.

Пример:

function foo() {
  let arrow = () => {
    console.log(this);     // will use foo's this as arrow will never have its own this
  }
  
  arrow.call({"x": "x"});  // ... even if we specify it using bind, call, or apply
}

foo.call({"y": "y"});      // specifying the this for foo (this value will eventually be used by arrow because it will be availbale in its scope)

4
ответ дан ibrahim mahrir 16 August 2018 в 04:45
поделиться
  • 1
    Вы можете уточнить это немного больше? – Kishan Patel 22 April 2017 в 11:42
  • 2
    @KishanPatel см. Ссылку на документы, которые я добавил. – ibrahim mahrir 22 April 2017 в 11:45
  • 3
    Таким образом, согласно MDN, функция стрелки не связывает это, и они также не имеют этого. – Kishan Patel 22 April 2017 в 11:48
  • 4
    Функция @KishanPatel Arrow похожа на мелкие. У них нет своих this (даже с bind они не будут). Они просто используют все, что this доступно в объеме, в котором они находятся. Я отправлю пример. – ibrahim mahrir 22 April 2017 в 11:50
  • 5
    Ох ... вот почему «это» возвращается к глобальному объекту в нашем случае. И «это» не определено в глобальном окне, и это показывает NaN, если вы попытаетесь умножить это на 2. Спасибо за разъяснение моих сомнений. – Kishan Patel 22 April 2017 в 11:54
Другие вопросы по тегам:

Похожие вопросы: