Почему любой код JavaScript хочет «обрезать привязку»?

10

Причина использования

(0, foo.fn)();

чтобы сократить связывание : thisне больше будет связан , fooно будет связано с глобальным объектом.

Но какова причина, по которой любой код JavaScript (или код Google JS) хотел бы обрезать привязку? (а это анти-паттерн или нет?)

nonopolarity
источник
называть это связыванием не кажется правильным. bindметод связывает. Здесь это просто изменение контекста. Вы не можете сократить или потерять связывание (связь, созданная bind).
Marzelin
может быть, этот код генерируется транспортером из какого-то функционального языка (clojurescript?), который имеет особые требования, когда речь идет о вызове функций?
Marzelin
Возможный дубликат Почему babel переписывает импортированный вызов функции в (0, fn) (…)? - или где еще ты видишь это?
Берги
Я думаю, что видел это в коде Google и, возможно, в некоторых рамках, таких как Angular, React или в некоторых других ... не могу вспомнить, где и иногда это минимизируется
неполярность

Ответы:

8

Этот вид кода обычно генерируется транспиляторами (такими как Babel), чтобы преобразовать современный JavaScript - который использует самые последние дополнения к спецификации - в версию JavaScript, которая более широко поддерживается.

Вот пример, где происходит этот шаблон транспиляции:

Допустим, у нас есть этот оригинальный код перед переносом:

import {myfunc} from "mymodule";
myfunc();

Чтобы сделать этот ES5-совместимый код, вы можете сделать это:

"use strict";    
var mymodule = require("mymodule");    
mymodule.myfunc();

Но здесь мы должны выполнить myfuncс mymoduleкак thisзначение, которое не происходит в исходном коде. И хотя это не всегда может быть проблемой, лучше убедиться, что функция ведет себя так же, как и в оригинальной версии , даже если эта функция будет использовать thisссылку - насколько необычным или даже бесполезным может быть использование thisin myfunc( потому что и в оригинальной версии это было бы undefined).

Так, например, если исходный код выдаст ошибку из-за this.memberFun()ссылки в функции, он также сгенерирует переданную версию.

Так вот, где оператор запятой используется, чтобы избавиться от этой разницы:

(0, mymodule.myfunc)();

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

trincot
источник
Как это requireсвязано с ES6 или ES5? Раньше я думал, что require - это модуль узла.
Connexo
requireдействительно является функцией, доступной в узле, или же предоставляется в библиотеках, таких как browserify, require.js и т. д. Это не имеет никакого отношения к ES5 / 6. С другой стороны, языковая конструкция типа ES6 + importне может быть перенесена в ES5 без чего-то вроде транспиляции.
Trincot
поэтому, если сжать его до нескольких строк резюме: если это библиотека или модуль, который включает в себя множество функций, которые на самом деле не являются методами или ОО (в форме modA.fn1), то эти функции действительно не следует использовать, thisно если случайно да, мы не хотим, thisчтобы модуль каким-либо образом воздействовал на модуль как побочный эффект, поэтому мы
обрезаем
Да, именно так вы могли бы подвести итог. Опять же, это в основном касается транспортеров, а не столько кодера.
Trincot