Чому будь-який код JavaScript хоче "перерізати прив'язку"?


10

Причина використання а

(0, foo.fn)();

полягає в тому, щоб перервати прив'язку : заперечення thisбільше не буде прив’язане, fooале буде прив’язане до глобального об'єкта.

Але яка причина, чому будь-який код JavaScript (або JS-код Google) хотів би перервати прив'язку? (і це антидіаграма чи ні?)


називати це прив’язкою, це не так. bindметод зв’язує. Тут це лише зміна контексту. Ви не можете перервати або втратити зв'язок (облігація, створена компанією bind).
марзелін

можливо, цей код генерується транспілером з якоїсь функціональної мови (clojurescript?), яка має конкретні вимоги, коли мова йде про функції виклику?
marzelin

можливий дублікат: Чому babel перезаписує імпортовану функцію викликає (0, fn) (…)? - чи де ще ви це бачите?
Берги

Я думаю, що я бачив це в коді Google і, можливо, в якійсь
такій

Відповіді:


8

Цей тип коду, як правило, генерується транспіляторами (як Babel), щоб перетворити сучасний JavaScript - для використання останніх доповнень до специфікації - у більш широку підтримку версії JavaScript.

Ось приклад, коли ця картина транспіляції відбувається:

Скажімо, у нас є цей оригінальний код перед транспіляцією:

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

Щоб зробити цей сумісний з ES5 код, ви можете зробити це:

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

Але тут ми повинні виконати myfuncз mymoduleяк thisзначення, яке не відбувається в вихідному коді. І хоча це не завжди може бути проблема, то краще , щоб функція поводиться так само , як це було б в оригінальній версії , навіть якщо ця функція буде використовувати thisпосилання - як незвичайні або навіть марно , що використання thisв myfuncможе бути ( бо і в оригінальній версії це було б undefined).

Так, наприклад, якщо оригінальний код this.memberFun()видасть помилку через посилання у функції, він також буде передаватись у перекладеній версії.

Отже, це те, що оператор з комами використовується для позбавлення від цієї різниці:

(0, mymodule.myfunc)();

Зрозуміло, що в коді, який ви самі пишете, ви ніколи не матимете гарного випадку використання цього шаблону, як ви б не використовували thisв myfuncпершу чергу.


Як це requireпов’язано або з ES6, або з ES5? Раніше я думав, що потрібно - це модуль вузла.
підключення

requireце дійсно функція, доступна у вузлі або іншому, що надається в бібліотеках, таких як Browserify, Requ.js, ... і т.д. Це спеціально не стосується ES5 / 6. З іншого боку, конструкція мови ES6 + на зразок importне може бути підтримана до ES5 без чогось на зразок транспіляції.
trincot

тож якщо конденсувати його на кілька рядків підсумків: якщо це бібліотека чи модуль, що включає безліч функцій, які насправді не є методами або OO, (у формі modA.fn1), то ці функції справді не слід використовувати, thisале якщо випадково вони роблять, ми не хочемо, thisщоб модуль жодним чином впливав на модуль як побічний ефект, тому ми вирізаємо прив’язку,
змусимо

Так, саме так можна було б підсумувати. Знову ж таки, це здебільшого турбує транспілятори, а не стільки кодер.
trincot
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.