Soru Bu, global olarak “katı kullan” ı etkinleştirir mi?


Benzer, ama aynı değil, ECMAScript'i global olarak nasıl "kullanabilirsiniz?"

aldım JavaScript Kalıpları ve kullanımı sıkılaştırmanızı önerir. İki düzine javascript dosyasına eklendiğinde, bir angarya olurdu, bu sayede global olarak kullanılabilir. Başlangıçta benim main.js'imin başına şöyle bir ekleme yapmayı düşündüm:

"use strict" 
require({
    priority: ["jquery", "raphael", "myapp"] 
});

Ancak daha sonra bunun sadece bu dosya için etkinleştirilebileceğini düşündüm. Sonra bunu düşündüm:

<script data-main="lib/main" src="lib/require.js">"use strict"</script>

Bunlardan ikisi de ECMAScript 5 sıkı modunu global olarak etkinleştirir mi?


25
2018-06-26 12:02


Menşei


İkinci örnek bir şey yapmazdı. Bir kod etiketinde bir src öznitelik, içerik göz ardı edilir. Bu soru, bağlantı kurduğunuzla aynı değil mi? Sorunuza mükemmel bir şekilde cevap veriyor gibi görünüyor (eğer çalışıyorsa). - Felix Kling
@Felix: Genellikle, kuralı bozan birkaç tarayıcı var. :-) - T.J. Crowder
@ T.J .: Her zaman bu istisnalar .... korkunç :) - Felix Kling
"sıkı kullanın"; <- Noktalı virgülü unutma! - Artur Czajka
@Artur: Bir olmadan da çalışıyor, ama evet, bunu dahil etmek en iyisi. Spesifikasyon, kelimenin tam anlamıyla veya otomatik semicolon sokulmasının sonucu olarak oldukça açıktır. - T.J. Crowder


Cevaplar:


TL; DR:

Hayır "use strict" birinde script eleman empoze etmez "use strict" diğer kodda script elementler. Sadece bir parçası olduğu kaynak metne uygulanır.

(Ayrı olarak, script Sorunun sonundaki etiket: eğer script eleman bir src, sahip olduğu herhangi bir metin, "belgeler" olarak kabul edilir ve göz ardı edilir.)


Güncelleştirme:

Şimdi şartnamede daha açık (belki de ES5'te açıktı, ama bana değil) evet, ayrı script elemanlar amaçları için ayrıdır "use strict". Orijinal cevapta aşağıdaki alıntı biraz değiştirildi "kod birimi" yerine "kaynak metin" demek ve Komut Dosyaları ve Modüller bölüm daha ayrıntılı olarak gider.


Orijinal cevap:

Şartname diyor:

Sözdizimsel kod birimi düzeyinde katı mod seçildiğinden, katı mod yalnızca bu tür bir kod biriminde yerel etkilere sahip kısıtlamalar uygular. Sıkı mod, çoklu kod birimlerinde tutarlı bir şekilde çalışması gereken ECMAScript semantiklerinin herhangi bir yönünü kısıtlamaz veya değiştirmez.

(Bölüm 4.2.2)

Yani soru şu: Farklı mı script farklı sözdizimsel kod birimleri etiketler?

V8 (Chrome'un içindeki JavaScript motoru), Hangi ayrı ve böylece tek bir koyarak "use strict"; sayfanızın en üstünde küresel kapsamda çalışmayacaktı. Belki de henüz bulamadığım bir yerde belirtilmiş, ama her durumda makul bir yorum.

İçin herhangi bir beyan olmadığını varsayarsak foo gösterilmeyen bu kod, Kapalı Globals Korkusu normal modda:

function test() {
    try {
      foo = "bar";
      display("foo = " + foo);
    }
    catch (e) {
      display("Exception: " + e);
    }
}

Normal modda, bu yeni bir global değişken oluşturur foo "bar" değeri ile ve gösterir "foo = bar" mesaj. Sıkı modunda, bir istisna atılır çünkü foo tanımlanmamış.

Bu komut dosyasını bir sayfaya koyarsam:

<script>
"use strict";
function test() {
    try {
      foo = "bar";
      display("foo = " + foo);
    }
    catch (e) {
      display("Exception: " + e);
    }
}
</script>

... İstisnai beklediğim gibi alıyorum (canlı örnek). Onları ayrı ayrı koyarsam script etiketler, yine de:

<script>
"use strict";
</script>
<script>
function test() {
    try {
      foo = "bar";
      display("foo = " + foo);
    }
    catch (e) {
      display("Exception: " + e);
    }
}
</script>

ben yapamaz istisnayı (V8'de) (örnek). Tarayıcının ve JavaScript motorunun nasıl etkileştiğini düşünürseniz bu makul olur.

Ve benzer şekilde, işlev başka bir dosyada kapalıysa ve şunu yaparım:

<script>
"use strict";
</script>
<script src="/inatoq"></script>

Ben istisna alamıyorum (örnek), aynı sebepten dolayı.

Örnek etiketinizin buraya geldiğini unutmayın:

<script data-main="lib/main" src="lib/require.js">"use strict"</script>

geçersizdir. bir script etiket olabilir ya sahip olmak src nitelik veya içerik, ama ikisi de değil. (Şey, temelde; ayrıntılar İşte [HTML5] ve İşte [HTML 4.01].) Varsa src Öğe, tarayıcı içeriği göz ardı etmemeli ve çoğu yapar. Çoğu. :-)


40
2018-06-26 12:21



Kitap, küresel olarak açıklamasından bahsediyor, ancak bunun nasıl yapılacağına dair bir örnek vermiyor. Sanırım her modülün başında olması gerekiyor. Ben düşündüm ana üzerine yerleştirerek requ.js tarafından yüklenen modüller aşağı '' kademeli '' olabilir. Her dosyada örtülü olarak bildirdiğimi varsayarsak, katı kuralları ihlal eden modüller için kolayca devre dışı bırakabileceğim anlamına gelir. - graham.reeds
Yukarıda yer alan Amazon bağlantısını takip ederseniz, kitabın içine bakabilir ve sayfa 5'tedir. - graham.reeds
Sözdizimsel kod birimlerinin genellikle tek bir dosyada birleştirildiğinden ve üretim kodu için küçültüldüğünden bahsetmek önemlidir. Bu temelde, şimdi tek bir sözdizimsel kod birimi olduğundan, genel olarak katı mod uygular. Bunun akılda tutulması ve JSLint'in beğenmediği "use strict"; kapanışların dışında. - jwueller


JSLint aniden bildiriyor: "kullanın sıkı" işlevini kullanın

(function () {
    "use strict";
    // put all of your strict code here


}());

8
2018-04-12 20:49





hayır, komut dosyaları dikkate alınır programs ve bunlar için code units. "use strict" bir komut dosyasından diğerine taşınmamalıdır.

Her komut dosyası etiketi tek tek yorumlanır ve aslında kendi kapsamı vardır. Bu kapsam, küresel olarak ilan edilen her şey küresel nesne üzerinde sona ereceğinden, ancak yine de var olmadığı için farkedilemez. Dize "use strict" sonunda çöp toplanacak program/ pointer etiketi, işaretçi / referans içermediği için.


6
2018-06-26 12:50



Yukarıdakiler için herhangi bir referansınız var mı? Açıkçası iş yerinde bir mekanizma var, ama ben söyleyemem "Her komut dosyası etiketi ... aslında kendi kapsamı vardır." çünkü onlar gerçekten (kendi yürütme bağlamı) yapmazlarsa var ve işlev bildirimleri. Ama açıkça bir şey var, ve eğer bana bir şeye işaret ederseniz daha iyi anlamak isterim. Teşekkürler, - T.J. Crowder
T.J. dedim. Bu cevap, alıntı gerektiren bir şeydir. Eğer global kapsamın tümü global nesnenin üzerine çıkıyorsa, bir etiketten diğerine nasıl farklı bir kapsam var? Duyduğum JS motorlarının her açıklamasında, global kapsamın LHS referansı olarak adlandırılan bir fonksiyonun içinde olmayan bir şey var ... farklı senaryolar için farklı kapsamlar için yapılan bir ayrım yok. Bu, katı mod gibi bazı şeyleri etkilemeyen bir çeşit farklı kapsamın mevcut olması olabilir, ancak bunu hak etmemekle birlikte, iddia, bir çeşit alıntıya ihtiyaç duyduğunu gördüğü birçok şeyin karşısındadır. - Jimbo Jonny
@JimboJonny: FYI, son teknikler bu konuda daha net (en azından benim için), daha yeni bağlantılar ekledim cevabım. Yani, hepimiz bu şekilde çalıştığını biliyorduk, ama ... - T.J. Crowder