(1,eval)
Eski eval
ile düz eski arasındaki fark , birincinin bir değer ve ikincisinin bir değer olmasıdır. Başka bir tanımlayıcı olsaydı daha açık olurdu:
var x;
x = 1;
(1, x) = 1;
Bu, (1,eval)
sonuç veren bir ifadedir eval
(aynen (true && eval)
ya da (0 ? 0 : eval)
söyleyeceği gibi), ancak bu bir referans değildir eval
.
Neden umurunda?
Eh, Ecma Spec bir düşünmektedir başvuru için eval
"doğrudan eval çağrısı" olarak, ama sadece sağladığı konusunda bir ifade eval
ve dolaylı eval aramaları küresel kapsamda yürütülecek garanti edilir - dolaylı biri olmak.
Hala bilmediğim şeyler:
- Ne durum altında doğrudan eval çağrı gelmez değil küresel kapsamda yürütmek?
- Ne durum altında olabilir
this
küresel kapsamında bir fonksiyonun değil küresel nesne verim?
Biraz daha bilgi toplanan olabilir burada .
DÜZENLE
Görünüşe göre, ilk sorumun cevabı "neredeyse her zaman". Doğrudan bir eval
mesafede yürütür akım sahası. Aşağıdaki kodu göz önünde bulundurun:
var x = 'outer';
(function() {
var x = 'inner';
eval('console.log("direct call: " + x)');
(1,eval)('console.log("indirect call: " + x)');
})();
Şaşırtıcı olmayan bir şekilde (heh-heh), bu çıktı:
direct call: inner
indirect call: outer
DÜZENLE
Daha fazla denemeden sonra, geçici olarak bunun veya this
olarak ayarlanamayacağını söyleyeceğim . Diğer yanlış değerlere (0, '', NaN, false) ayarlanabilir, ancak yalnızca çok kasıtlı olarak.null
undefined
Kaynağınızın hafif ve tersine çevrilebilir bir kranio-rektal inversiyondan muzdarip olduğunu ve Haskell'de bir hafta programlama yapmayı düşünebileceğini söyleyeceğim.