(1,eval)Eski evalile 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 evalve 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
thiskü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 evalmesafede 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 thisolarak ayarlanamayacağını söyleyeceğim . Diğer yanlış değerlere (0, '', NaN, false) ayarlanabilir, ancak yalnızca çok kasıtlı olarak.nullundefined
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.