Neden herhangi bir JavaScript kodu “bağlamayı kesmek” istiyor?


10

Bir kullanmanın nedeni

(0, foo.fn)();

etmektir bağlama kesmek : thisbağlı olmayacak artık olacak fooama küresel nesneye bağlı olacaktır.

Ancak, herhangi bir JavaScript kodunun (veya Google'ın JS kodunun) bağlamayı kesmek istemesinin nedeni nedir? (ve bir anti-desen mi, değil mi?)


ona bağlanma demek doğru gelmiyor. bindyöntem bağları. Burada sadece bir bağlam değişikliği var. Bağlamayı kesemez veya kaybedemezsiniz (yarattığı bağ bind).
marzelin

belki bu kod, çağrı işlevleri söz konusu olduğunda belirli gereksinimleri olan bazı işlevsel dilden (clojurescript?) bir transpiler tarafından üretilir?
marzelin

olası yinelenen Why babel yeniden yazma işlevi çağrısı (0, fn) ithal etmez (...)? - ya da başka nerede görüyorsun?
Bergi

Sanırım Google'ın kodunda ve muhtemelen Angular, React veya diğer bazı çerçevelerde gördüm ... nerede ve bazen küçültüldüğünü hatırlayamıyorum
nonopolarity

Yanıtlar:


8

Bu tür bir kod, tipik olarak, belirtime en son eklenenleri kullanan modern JavaScript'i daha yaygın olarak desteklenen bir JavaScript sürümüne dönüştürmek için transpiller (Babel gibi) tarafından üretilir.

İşte bu transpilasyon paterninin oluştuğu bir örnek:

Diyelim ki transpilasyondan önce bu orijinal koda sahibiz:

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

Bu ES5 uyumlu kodu yapmak için şunları yapabilirsiniz:

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

Ama burada yürütülür myfuncile mymoduleolduğu gibi thisorijinal kodda olmuyor değeri. O kudreti daima bir sorun olmayacaktır rağmen, emin fonksiyon davranır yapmak daha iyidir sadece orijinal versiyonu yazar gibi o işlevi kullanmak istiyorsunuz bile, thisne kadar sıradışı ve hatta yararsız kullanımı o - referansı thisiçinde myfunc(olabilir çünkü orijinal versiyonda da olurdu undefined).

Örneğin, orijinal kod this.memberFun()işlevdeki bir başvuru nedeniyle bir hata atarsa, aktarılan sürümde de atar.

Yani virgül operatörü bu farktan kurtulmak için kullanılır:

(0, mymodule.myfunc)();

Kullanmak olmaz gibi Verilen, kodda kendini yazma göre, bu model için iyi bir kullanım durum var asla thisyılında myfuncilk etapta.


requireES6 veya ES5 ile nasıl ilişkilidir? Gereksinimin bir düğüm modülü olduğunu düşünürdüm.
connexo

requiregerçekten düğümde bulunan veya browserify, requir.js, ... vb. kütüphanelerde sağlanan bir işlevdir. Özellikle ES5 / 6 ile ilgili değildir. Öte yandan, benzer bir ES6 + dil yapısı import, transpilasyon gibi bir şey olmadan ES5'e aktarılamaz.
trincot

bu yüzden bir özetin birkaç satırına yoğunlaştırırsa: gerçekten yöntem veya OO olmayan ( modA.fn1) şeklinde birçok işlev içeren bir kütüphane veya modülse, bu işlevler gerçekten kullanılmamalıdır, thisancak yanlışlıkla onlar this, modülü herhangi bir şekilde bir yan etki olarak etkilemesini istemiyoruz , bu yüzden bağlamayı kestik, bağımsız bir
işlevse

Evet, gerçekten bu şekilde özetleyebilirsiniz. Yine, bu çoğunlukla kodlayıcılar için değil, transpiller için bir endişe kaynağıdır.
trincot
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.