Η Javascript ισοδύναμο των κατοίκων της Python ();

ψήφοι
19

Σε Python μπορεί κανείς να πάρει ένα λεξικό όλων των τοπικών και παγκόσμιων μεταβλητές στο τρέχον πεδίο με τις ενσωματωμένες λειτουργίες locals()και globals(). Υπάρχει κάποιο ισοδύναμο τρόπο για να γίνει αυτό Javascript εκεί; Για παράδειγμα, θα ήθελα να κάνω κάτι σαν το παρακάτω:

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

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

Είναι αυτό σε όλες τις δυνατές, ή θα πρέπει να απλά να χρησιμοποιείτε ένα τοπικό αντικείμενο της αναζήτησης;

Δημοσιεύθηκε 02/09/2008 στις 17:29
πηγή χρήστη
Σε άλλες γλώσσες...                            


6 απαντήσεις

ψήφοι
4

Λοιπόν, δεν νομίζω ότι υπάρχει κάτι τέτοιο στην js. Μπορείτε πάντα να χρησιμοποιήσετε eval αντί ντόπιους (). Σαν αυτό:

eval(s+"()");

Απλά πρέπει να γνωρίζουν ότι στην πραγματικότητα λειτουργούν foo υπάρχει.

Επεξεργασία:

Μην χρησιμοποιείτε eval :) Χρήση:

var functionName="myFunctionName";
window[functionName]();
Απαντήθηκε 02/09/2008 στις 17:36
πηγή χρήστη

ψήφοι
0

AFAIK, όχι. Αν απλά θέλετε να ελέγξετε την ύπαρξη μιας συγκεκριμένης μεταβλητής, μπορείτε να το κάνετε με τη δοκιμή για αυτό, κάτι σαν αυτό:

if (foo) foo();
Απαντήθηκε 02/09/2008 στις 17:41
πηγή χρήστη

ψήφοι
3

Μου φαίνεται πως Brendan Eich σχολίασε σε πρόσφατη podcast,? Αν θυμάμαι καλά, δεν είναι να θεωρείται, όπως προσθέτει παράλογους περιορισμούς στη βελτιστοποίηση. Την σύγκριση με την argumentsτοπική ότι, ενώ χρήσιμα για varargs, την ίδια την ύπαρξή του αφαιρεί τη δυνατότητα να μαντέψετε τι είναι συνάρτηση θα αγγίξει απλά κοιτάζοντας τον ορισμό της.

BTW: πιστεύω JS δεν έχουν υποστήριξη για την πρόσβαση σε ντόπιους μέσα από τα επιχειρήματα των τοπικών σε ένα χρόνο - μια γρήγορη αναζήτηση δείχνει αυτό έχει καταργηθεί όμως.

Απαντήθηκε 02/09/2008 στις 17:50
πηγή χρήστη

ψήφοι
0

@ E-Bartek, νομίζω ότι το παράθυρο [functionName] δεν θα λειτουργήσει αν σε κάποια κλείσιμο, και το όνομα της συνάρτησης είναι τοπική σε αυτό το κλείσιμο. Για παράδειγμα:

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

Στην περίπτωση αυτή, s είναι η «γραμμή», αλλά η λειτουργία «γραμμή» υπάρχει μόνο μέσα στο πεδίο της λειτουργίας «foo». Δεν ορίζεται στο πεδίο παράθυρο.

Φυσικά, αυτό δεν απαντά στην πραγματικότητα την αρχική ερώτηση, θα ήθελα απλώς να συζητούν το θέμα αυτό απάντηση. Δεν πιστεύω ότι υπάρχει ένας τρόπος για να κάνει ό, τι η αρχική ερώτηση.

Απαντήθηκε 02/09/2008 στις 18:00
πηγή χρήστη

ψήφοι
0

@pkaeding

Ναι έχεις δίκιο. παράθυρο [functionName] () δεν λειτουργεί σε αυτή την περίπτωση, αλλά eval κάνει. Αν χρειαζόμουν κάτι τέτοιο, θα ήθελα να δημιουργήσω το δικό μου αντικείμενο να κρατήσει αυτές τις λειτουργίες μαζί.

var func = {};
func.bar = ...;
var s = "bar";
func[s]();
Απαντήθηκε 02/09/2008 στις 18:14
πηγή χρήστη

ψήφοι
16

  • ντόπιους () - Όχι.

  • globals () - Ναι.

windowείναι μια αναφορά για την παγκόσμια εμβέλεια, όπως και globals()σε python.

globals()["foo"]

είναι το ίδιο με:

window["foo"]
Απαντήθηκε 02/09/2008 στις 19:01
πηγή χρήστη

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