2015-05-18 3 views
5

Bu kod satırı neden başarısızlığa uğratmalı?Yeni İşlev ve değerlendirme arasındaki garip etkileşim

new Function("eval('function foo(){ alert() }'); foo()")() 

O beklendiği gibi Chromium'da bir uyarı çıkar, fakat (foo tanımlanmamış) Firefox'ta başarısız olur. Bu bir Firefox hatası mı yoksa kodumda bir sorun mu var?

+0

Bu, katı/katı olmayan bir mod gibi bir şey gibi geliyor - her ikisini de katı olmayan modda mı çalıştırıyorsunuz? (Chrome'un davranışı) veya katı mod (Firefox’lar)? (Güncelleme: bu es515 es2015 (es6) şey bir es5 vs olabilir) bakarak bu konuda düşündüm –

+0

@BenjaminGruenbaum. Eminim hem sıkı olmayan modda koştum. Ancak, katı modun herhangi bir etkisi olmamalıdır, çünkü yeni İşlev bunu yansıtmamalıdır (normal bir işlevin aksine). – user2345215

+0

Tarayıcıların farklı davrandığı ilginç olsa da, neden "neden önemsiyoruz?" Diye merak ediyorum. XD –

cevap

-1

Sorun şu ki, eval genel kapsamı devralmadığı için, foo çağrıldığı yerden farklı bir kapsamda oluşturulur. Kapsamı, işlev tanımında veya eval'a geçerek açıkça belirterek çözebilirsiniz. Yani aşağıdaki snippet'lerden hem beklendiği gibi çalışır:

new Function("eval('window.foo = function(){ alert() }'); foo()")() 

new Function("eval('function foo(){ alert() }', this); foo()")() 

Bu davranış burada "use strict"; + jQuery.getScript() = script can't export to global namespace cevap tarafından açıklandığı gibi, katı modda ilişkili gibi görünmektedir.

+1

»eval', global kapsamı kullanmak için tasarlanmamıştır, ancak yerel işlev kapsamı çağrıldığından (ve bunun içinde foo()' denir). Ayrıca ikinci snippet'iniz mantıklı değil, "eval" ikinci bir parametre almıyor. – Bergi

+0

Aslında https://dev.mozilla.jp/localmdc/localmdc_3355.html yapar. Ancak ikinci argüman artık kullanılmıyor gibi gözüküyor, bu yüzden bir tanesi uygulamaya konulmamalı (Firefox'un son sürümünde test ettim ve işe yarıyorsa) – taddeus