JavaScript Python'un yerli eşdeğeri ()?

oy
19

Python'da bir yerleşik işlevleri ile geçerli kapsamda tüm yerel ve global değişkenler bir sözlük alabilirsiniz locals()ve globals(). JavaScript bunu yapmanın bazı eşdeğer bir yolu var mı? Örneğin, aşağıdaki gibi bir şey yapmak istiyorum:

var foo = function(){ alert('foo'); };
var bar = function(){ alert('bar'); };

var s = 'foo';
locals()[s](); // alerts 'foo'

Bu mümkünse mi, yoksa sadece arama için yerel bir nesne kullanıyor olmalıdır?

Oluştur 02/09/2008 saat 17:29
kaynak kullanıcı
Diğer dillerde...                            


6 cevaplar

oy
4

Eh, ben js içinde buna benzer bir şey olduğunu düşünmüyorum. Her zaman yerli yerine eval kullanabilirsiniz (). Bunun gibi:

eval(s+"()");

Sadece aslında işlev olduğunu bilmek zorunda foo bulunmaktadır.

Düzenle:

eval kullanmayın :) kullanın:

var functionName="myFunctionName";
window[functionName]();
Cevap 02/09/2008 saat 17:36
kaynak kullanıcı

oy
0

hayır, AFAIK. Sadece belirli bir değişkenin varlığını kontrol etmek istiyorsanız, bunun için böyle bir şey test ederek bunu yapabilirsiniz:

if (foo) foo();
Cevap 02/09/2008 saat 17:41
kaynak kullanıcı

oy
3

Ben Brendan Eich son podcast bu yorumladı hatırlar gibiyim; eğer doğru geri çağırmak o optimizasyon mantıksız kısıtlamalar getiriliyor olarak, bu kabul ediliyor değil. O karşılaştırdık argumentsvarargs için yararlı iken, onun varlığının bir işlevin tanımından bakarak sadece dokunmak ne tahmin yeteneğini kaldıran, yani yerel.

BTW: i JS iman etmedi tek seferde yerel argümanlar aracılığıyla halk erişim için destek var - bir hızlı arama bu olsa kullanımdan kaldırıldı gösterir.

Cevap 02/09/2008 saat 17:50
kaynak kullanıcı

oy
0

@ E-bartek, ben pencere [functionName] bazı kapatılmasıyla eğer çalışmaz düşünüyorum ve işlev adı şekilde kapağa yerel. Örneğin:

function foo() {
    var bar = function () {
        alert('hello world');
    };
    var s = 'bar';
    window[s](); // this won't work
}

Bu durumda, s 'bar' olmakla işlevin 'bar' Yalnızca fonksiyonu 'foo' kapsamında içinde var. Bu pencere kapsamında tanımlı değil.

Tabii ki, bu gerçekten orijinal soruya cevap vermez, sadece bu yanıta uymak istedim. Ben orijinal soru sorulduğunda ne yapacağını bir yol yoktur inanmıyorum.

Cevap 02/09/2008 saat 18:00
kaynak kullanıcı

oy
0

@pkaeding

Evet haklısın. Pencere [functionName] () bu durumda çalışmaz, ama eval yapar. Böyle bir şey Gerekirse, ben birlikte bu işlevleri tutmak için kendi nesne oluşturmak istiyorum.

var func = {};
func.bar = ...;
var s = "bar";
func[s]();
Cevap 02/09/2008 saat 18:14
kaynak kullanıcı

oy
16

  • Yerliler () - Hayır.

  • globaller () - Evet.

windowgibi küresel kapsamda bir başvuru olduğu globals()python.

globals()["foo"]

aynıdır:

window["foo"]
Cevap 02/09/2008 saat 19:01
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more