“katı mod” nedir ve nasıl kullanılır?


134

Mozilla Geliştirici Ağı'ndaki JavaScript referansını inceledim ve denilen bir şeyle karşılaştım "strict mode". Onu okudum ve ne yaptığını anlamakta zorlanıyorum. Birisi kısaca (genel olarak) amacının ne olduğunu ve nasıl faydalı olduğunu açıklayabilir mi?


Yanıtlar:


149

Temel amacı daha fazla kontrol yapmaktır.

"use strict";Başka bir şey yapmadan önce kodunuzun en üstüne ekleyin .

Örneğin blah = 33;, geçerli bir JavaScript. Tamamen küresel bir değişken oluşturduğunuz anlamına gelir blah.

Ancak katı modda, bir değişkeni bildirmek için "var" anahtar sözcüğünü kullanmadığınız için bu bir hatadır.

Çoğu zaman rasgele bir kapsamın ortasında küresel değişkenler oluşturmak istemezsiniz, bu yüzden çoğu zaman bu blah = 33bir hatadır ve programcı aslında küresel bir değişken olmasını istemiyordu, yazmak için var blah = 33.

Benzer şekilde, teknik olarak geçerli olan birçok şeye izin vermiyor. NaN = "lol"hata üretmez. NaN değerini de değiştirmez. katı bu (ve benzer garip ifadeler) kullanarak hatalar üretir. Çoğu insan bunu takdir ediyor çünkü yazmak için bir sebep yok NaN = "lol", bu yüzden büyük olasılıkla bir yazım hatası vardı.

Sıkı modda MDN sayfasında daha fazla bilgi edinin


4
Bu MDN'yi de üzerinde belgelerin tam kopyası
nkcmr

23
O zaman onun faydası hakkında ne anlamıyorsun? Geçerli-ancak-büyük olasılıkla-hata olan şeyleri yakalayarak gelişime yardımcı olmayı amaçlamaktadır.
Simon Sarris

34

Zaten Simon'un cevap bahsedilmeyen katı modda bir yönü katı mod setleri olmasıdır thisiçin undefinedişlevlerde işlev çağırma yoluyla çağrılan.

Yani böyle şeyler

function Obj() {
   this.a = 12;
   this.b = "a";
   this.privilegedMethod = function () {
      this.a++;
      privateMethod();
   };

   function privateMethod() {
     this.b = "foo";
   }
}

genel nesneye gereksiz bir özellik eklemek yerine privateMethodçağrıldığında (bir özellik ekleyemediğiniz için undefined) hataya neden olur b.


4
evet eklemek privateMethod.bind(this)();ve aramak gerekirnew jsbin.com
hlcs


21

Dilin gelecekteki sürümleri için iyi bir hedef olabilecek EcmaScript'in kolayca statik olarak analiz edilebilir bir alt kümesi olacak şekilde katı mod eklendi. Sıkı mod, kendilerini katı moda sınırlayan geliştiricilerin daha az hata yapmaları ve yaptıkları hataların daha belirgin yollarla ortaya çıkması ümidiyle de tasarlanmıştır.

Umarım EcmaScript'in bir sonraki ana sürümü olacak olan uyum , ES5'in üzerine inşa edilecektir.

Harmony, çok fazla moddan kaçınmak için ES5 katı modunu temel alır.

Diğer bazı dil deneyleri de katı moda bağlıdır. SES , ES5 katı modun analiz edilebilirliğine bağlıdır.

SES (Güvenli ECMAScript) Tasarım Deneyi

ES5 / Strict'deki özellikleri kaldırarak veya onararak Nesne Yeteneği Programlama Dili tasarlama.

SES'den ES5 / Strict'e basit bir çeviri olmalıdır.

Standardın Ek C'si katı mod ile normal mod arasındaki farkları açıklar.

Katı mod kısıtlaması ve istisnalar

  • "Uygular", "arayüz", "let", "paket", "özel", "korumalı", "genel", "statik" ve "verim" tanımlayıcıları, katı mod kodu içinde FutureReservedWord belirteçleri olarak sınıflandırılır. (7.6.12 [?]).
  • Uygun bir uygulama, katı mod kodunu işlerken, NumericLiteral (7.8.3) sözdizimini B.1.1'de açıklandığı gibi OctalIntegerLiteral'i içerecek şekilde genişletmeyebilir.
  • Uygun modda bir uygulama, katı mod kodunu işlerken (bkz. 10.1.1), EscapeSequence sözdizimini B.1.2'de açıklandığı gibi OctalEscapeSequence'ı içerecek şekilde genişletmeyebilir.
  • Bildirilmemiş bir tanımlayıcıya veya başka bir şekilde çözümlenemeyen bir referansa atama, global nesnede bir özellik oluşturmaz. Katı mod kodu içinde basit bir atama gerçekleştiğinde, LeftHandSide çözümlenemeyen bir Referans olarak değerlendirilmemelidir. Bunu yaparsa ReferenceError istisnası atılır (8.7.2). LeftHandSide ayrıca {[[Writable]]: false} özellik değerine sahip bir veri özelliğine, {[[Set]]: undefined} özellik değerine sahip bir erişimci özelliğine veya var olmayan bir öğeye başvuru olmayabilir. [[Extensible]] internal özelliği false değerine sahip bir nesnenin özelliği. Bu durumlarda bir TypeError istisnası atılır (11.13.1).
  • Tanımlayıcı değerlendirmesi veya bağımsız değişkenler, Atama işlecinin (11.13) veya PostfixExpression'un (11.3) LeftHandSideExpression'u ya da Önek Artışı (11.4.4) veya Önek Azaltma (11.4.5) operatörü tarafından işletilen UnaryExpression olarak görünmeyebilir . Katı mod işlevleri için bağımsız değişken nesneleri, erişime TypeError istisnası atan (10.6) "caller" ve "callee" adlı yapılandırılamayan erişimci özelliklerini tanımlar.
  • Katı mod işlevleri için bağımsız değişken nesneleri, dizi dizinli özellik değerlerini işlevlerinin karşılık gelen resmi parametre bağlarıyla dinamik olarak paylaşmaz. (10.6). Katı mod işlevleri için, bir argümanlar nesnesi oluşturulursa, yerel tanımlayıcı argümanlarının arguments nesnesine bağlanması değiştirilemez ve dolayısıyla atama ifadesinin hedefi olmayabilir. (10.5).
  • Katı mod kodu herhangi bir data özelliğinin birden fazla tanımına sahip bir ObjectLiteral içeriyorsa (11.1.5) bir SyntaxError'dur. Kesin kodda bulunan bir PropertyAssignment öğesinin PropertySetParameterList öğesinde Tanıtıcı olarak veya FunctionBody katı koduysa (11.1.5), Tanımlayıcı "eval" veya Tanıtıcı "argümanları" bir SyntaxError'dur.
  • Katı mod değerlendirme kodu, değerlendirilecek arayanın değişken ortamındaki değişkenleri veya işlevleri başlatamaz. Bunun yerine, yeni bir değişken ortam oluşturulur ve bu ortam, değerlendirme kodu (10.4.2) için deklarasyon bağlama örneği için kullanılır.
  • Bu katı mod kodu içinde değerlendirilirse, bu değer bir nesneye zorlanmaz. Bu null veya undefined değeri genel nesneye dönüştürülmez ve ilkel değerler sarıcı nesnelere dönüştürülmez. Bu değer bir işlev çağrısı ile iletildi (Function.prototype.apply ve Function.prototype.call kullanılarak yapılan çağrılar dahil), bu değeri bir nesneye (10.4.3, 11.1.1, 15.3.4.3, 15.3) iletmeye zorlamaz. 4.4).
  • Sıkı mod kodunda bir silme işleci oluştuğunda, UnaryExpression değeri bir değişkene, işlev bağımsız değişkenine veya işlev adına doğrudan başvuru ise bir SyntaxError atılır (11.4.1).
  • Katı mod kodunda bir silme işleci oluştuğunda, silinecek özelliğin {[[Configurable]]: false} (11.4.1) özelliğine sahip olması durumunda TypeError atılır. Bir VariableDeclaration veya VariableDeclarationNoIn öğesinin katı kod içinde meydana gelmesi ve Identifier değerinin eval veya argüman olması SyntaxError'dur (12.2.1).
  • Katı mod kodu bir WithStatement içeremez. Böyle bir bağlamda bir WithStatement oluşumu bir SyntaxError'dur (12.10).
  • Sıkı kod içinde bir Catch ile TryStatement oluşursa ve Catch üretiminin Tanımlayıcısı eval veya argümanlar ise bir SyntaxError'dur (12.14.1)
  • Tanımlayıcı değerlendirmesinin veya bağımsız değişkenlerin katı mod FunctionDeclaration veya FunctionExpression (13.1) biçimindeki FormalParameterList içinde görünmesi bir SyntaxError'dur.
  • Katı modda aynı ada sahip iki veya daha fazla resmi parametre olmayabilir. Bir FunctionDeclaration, FunctionExpression veya Function yapıcısını kullanarak böyle bir işlev yaratma girişimi bir SyntaxError'dur (13.1, 15.3.2).
  • Bir uygulama, bu spesifikasyonda tanımlanandan başka, arayan adı verilen özelliklerin katı mod fonksiyonları içindeki anlamları veya fonksiyon örneklerinin argümanlarını genişletemez. ECMAScript kodu, katı mod işlevlerine karşılık gelen işlev nesnelerinde bu adlara sahip özellikler oluşturamaz veya değiştiremez (10.6, 13.2, 15.3.4.5.3).
  • Sıkı mod kodu içinde tanımlayıcıların değerlendirmesini veya bağımsız değişkenlerini bir İşlev Bildirimi veya İşlev Ekspresyonu Tanımlayıcısı veya resmi bir parametre adı (13.1) olarak kullanmak bir SyntaxError'dur. İşlev yapıcısını (15.3.2) kullanarak böyle bir katı mod işlevini dinamik olarak tanımlamaya çalışmak bir SyntaxError istisnası atar.

6

ECMAScript 5 katı mod kavramını tanıttı .

Kodda Sıkı Modu Çağırma

Katı mod, komut dosyalarının tamamı veya tek tek işlevler için geçerlidir. {} Parantezleri içine alınmış blok deyimi için geçerli değildir, bu tür bağlamlara uygulanmaya çalışmak hiçbir şey yapmaz.

Komut dosyasının tamamı:

Diyelim ki app.js oluşturuyoruz, bu yüzden ilk deyim kullanım komut dosyası eklemek tüm kod için katı modu zorlar.

// app.js whole script in strict mode syntax
use strict”;
// Now you can start writing your code 

İşlev için sıkı mod:

Bir işlev için katı modu çağırmak için tam ifadeyi “katı kullanın”; herhangi bir ifadeden önce işlev gövdesinin başlangıcında.

function yourFunc(){
 "use strict";

 // Your function code logic
}

Katı mod, normal Javascript semantiğinde birkaç değişiklik içerir. İlk katı mod, hataları atmak için değiştirerek bazı JavaScript sessiz hatalarını ortadan kaldırır.

Örnek için: Sıkı Mod kullanarak kodlama

resim açıklamasını buraya girin

Yukarıdaki kod örneğinde, kodda katı mod kullanılmadan bir hata atmaz. Değişkeni xbildirmeden eriştiğimiz için. Yani katı modda kayıt dışı değişkene erişim bir hata atar.

Şimdi x değişkenine katı mod olmadan bildirmeden erişmeye çalışalım.

(function(){
    x = 3;
})();

// Will not throw an error

Sıkı mod kullanmanın avantajı:

  • Hata atarak JavaScript sessiz hatalarını ortadan kaldırın.
  • JavaScript motorunun optimizasyon yapmasını zorlaştıran hatayı düzeltir.
  • Kodun, katı modda olmayan özdeş koddan daha hızlı çalışmasını sağlama
  • ECMAScript'in gelecekteki sürümünde tanımlanması muhtemel bazı sözdizimini yasaklar.

5

Katı mod, normal JavaScript semantiğinde birkaç değişiklik yapar.

  • katı mod, bazı JavaScript sessiz hatalarını hata atmalarını değiştirerek ortadan kaldırır.

  • katı mod, JavaScript motorlarının optimizasyon yapmasını zorlaştıran hataları düzeltir.

  • katı mod, ECMAScript'in gelecekteki sürümlerinde tanımlanması muhtemel bazı sözdizimini yasaklar.


1

ECMAScript5 bazı yeni nesneler ve özellikler ve aynı zamanda sözde "strict mode" .

Katı mod, kullanımdan kaldırılan özellikleri hariç tutan dilin bir alt kümesidir. Katı mod kaydolma ve zorunlu değildir, yani kodunuzun katı modda çalışmasını istiyorsanız, aşağıdaki dizeyi (işlev başına bir kez veya tüm program için bir kez) kullanarak niyetinizi beyan edersiniz:

"use strict";

1

2017 ve sonunda belgeleri bulduk:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode

Sıkı mod, kısıtlı bir JavaScript varyantını seçmenin bir yoludur. Katı mod yalnızca bir alt küme değildir: kasıtlı olarak normal koddan farklı anlambilime sahiptir. Katı modu desteklemeyen tarayıcılar, tarayıcılardan farklı davranışlarla katı mod kodunu çalıştırır, bu nedenle katı modun ilgili yönleri için destek için özellik testi olmadan katı moda güvenmeyin. Sıkı mod kodu ve katı olmayan mod kodu bir arada bulunabilir, bu nedenle komut dosyaları aşamalı olarak katı moda geçebilir.


Katı mod, normal JavaScript semantiğinde birkaç değişiklik yapar. İlk olarak, katı mod bazı JavaScript sessiz hatalarını hata atmalarını değiştirerek ortadan kaldırır. İkincisi, katı mod, JavaScript motorlarının optimizasyon yapmasını zorlaştıran hataları düzeltir: katı mod kodu bazen katı mod olmayan özdeş koddan daha hızlı çalışabilir. Üçüncü olarak, katı mod, gelecekteki ECMAScript sürümlerinde tanımlanması muhtemel bazı sözdizimini yasaklar.


0

Soru:
Karşılaştığım sorun aşağıda, bir öğreticiyi takip ediyordum ve aşağıdaki scssdosyayı derlemeye ve ondan CSS kodu oluşturmaya çalıştım,

.fatty{
  width: percentage(6/7);
}

aşağıdaki gulpfile.jsgörevi kullanarak :

var gulp = require('gulp');
var sass = require('gulp-sass');

gulp.task('sass', function () {
    return gulp.src('app/scss/styles.scss')
        .pipe(sass())
        .pipe(gulp.dest('app/css'))
});

Bu yüzden aldığım hata aşağıdaki gibidir:

~/htdocs/Learning/gulp1/node_modules/gulp-sass/index.js:66
    let sassMap;
    ^^^

SyntaxError: Block-scoped declarations (let, const, function, class) not yet supported outside strict mode
    at exports.runInThisContext (vm.js:53:16)
    at Module._compile (module.js:373:25)
// stacktrace here...

Çözüm:
Bu yüzden index.jsgulp-sass modülümün içindeki dosyayı gösteriyor (temelde kilitli ve düzenlenmemeli). Ama zorla gidip "use_strict"bu index.jsdosyanın üstüne eklerseniz, görevimi sorunsuz bir şekilde yürütür.

Çaresizdim, bu yüzden bunu çözüm olarak kullanmaya devam ediyorum! Ama sonra başka bir SO Q & A'dan geçtikten sonra aşağıdaki cevabı gördüm :

sudo npm install -g n
sudo n stable

ve daha sonra NodeJ'lerimi (Version10.x'e) güncelledim ve sonra Terminal'in talimat verdiği gibi aşağıdaki komutları çalıştırarak Gulp'i yeniden oluşturdum:

npm rebuild node-sass --force

Ve her şey yolunda. Böylece böyle çözüldü. index.jsGulp modül dosyası için yaptığım değişiklikleri geri aldım . Ve şimdi sorunsuz çalışıyor.

Umarım bu cevap orada birine yardımcı olacaktır!

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.