Причина, по которой `JsValue::from(canvas)` работает без использования ссылки (`&`), в то время как `JsValue::from(element)` требует ссылки (`&`), связана с реализацией `From` trait в Rust и особенностями некоторых типов данных.
В Rust множество типов реализуют `From<T>` trait, который позволяет конвертировать один тип в другой. Когда мы вызываем `JsValue::from(some_value)`, Rust применяет метод `from` для типа `JsValue`, который принимает значение `some_value` типа `T` и конвертирует его в `JsValue`.
В случае `JsValue::from(canvas)`, метод `from` для `JsValue` ожидает значение типа `Into<JsValue>`. `Into` - это другой trait в Rust, который описывает конвертацию из типа `T` в другой тип. И поскольку `canvas` реализует `Into<JsValue>`, и вызов `JsValue::from(canvas)` возвращает `JsValue`.
С другой стороны, при вызове `JsValue::from(element)`, метод `from` ожидает значение типа `&T`. Тип `element` не реализует `Into<JsValue>`, но реализует `From<Element>`. Поэтому мы должны передать ссылку на `element` при вызове `JsValue::from(&element)`, чтобы соответствовать ожидаемому типу `&T`.
Таким образом, различие в использовании ссылки в этих двух случаях связано с тем, как реализованы конверсии через `From` и `Into` traits для соответствующих типов данных.