migf1 Δημοσ. 20 Οκτωβρίου 2013 Δημοσ. 20 Οκτωβρίου 2013 Έχω φτιάξει μια αναδρομική συνάρτηση για να κάνω blink το jQuery object στο οποίο την εφαρμόζω: jQuery.fn.myblink = function(rate) { var $this = jQuery(this); var r = rate ? rate : 'slow'; $this.fadeOut(r).fadeIn(r, function(){ $this.myblink(r); }); }; και κατόπιν... ... jQuery(selector).myblink(1000); Υπάρχει κάποιος ιδιαίτερος λόγος να την γράψω με jquery plugin syntax? (function($){ $.fn.myblink = function(rate) { var r = rate ? rate : 'slow'; $(this).fadeOut(r).fadeIn(r, function(){ $(this).myblink(r); }); } })(jQuery); Υπάρχει κάποιο pitfall στον 1ο τρόπο; Είναι η μόνη τους διαφορά πως με τον 2ο τρόπο δεν μολύνω τα jQuery/jQuery.fn namespaces ή υπάρχει και κάτι άλλο;
defacer Δημοσ. 20 Οκτωβρίου 2013 Δημοσ. 20 Οκτωβρίου 2013 Είναι το ίδιο πράγμα ακριβώς, δεν υπάρχει καμία διαφορά. BTW αυτό var r = rate ? rate : 'slow'; σε JS είναι ιδιωματικό να γράφεται ως var r = rate || "slow";
AllCowsEatGrass Δημοσ. 21 Οκτωβρίου 2013 Δημοσ. 21 Οκτωβρίου 2013 Αν καλέσεις τη συνάρτηση έτσι ... jQuery(selector).myblink(1000); τότε αυτό το line var r = rate ? rate : 'slow'; εξυπηρετεί το σκοπό που νομίζεις. null Checking. Αν την καλέσεις έτσι όμως ... jQuery(selector).myblink(true); απλώς κάνει evaluate μία bool μεταβλητή.Εγώ προτιμώ αυτό: var r = (rate === undefined || rate === null) ? 'slow' : rate; Διορθώστε με αν κάνω λάθος!
migf1 Δημοσ. 21 Οκτωβρίου 2013 Μέλος Δημοσ. 21 Οκτωβρίου 2013 Χμ, δεν βλέπω ο τρόπος σου να αντιμετωπίζει διαφορετικά από τον δικό μου το πέρασμα του rate ως true (το οποίο btw, κατά την άποψή μου παρείναι... nitpicking, εννοώ πως συνήθως υποτίθεται ότι κοιτάμε τι περιμένει μια συνάρτηση πριν την χρησιμοποιήσουμε) EDIT: Ξέχασα, επίσης από όσο ξέρω τόσο το undefined όσο και το null επιστρέφουν έτσι κι αλλιώς false σε generic checking, έτσι δεν είναι;
AllCowsEatGrass Δημοσ. 21 Οκτωβρίου 2013 Δημοσ. 21 Οκτωβρίου 2013 Ίσως να μη το διατύπωσα ολοκληρωμένα, ίσως να μη βοηθάει και το παράδειγμα σου σ' αυτο που είχα κατα νου. Ας προσπαθήσω ξανά. var _printWhat = function(val /* Expecting bool here! */ ) { alert(val ? "true" : "false"); } var undef; var nil = null; var f = false; _printWhat(undef); _printWhat(nil); _printWhat(f); Σ' αυτό το παράδειγμα, στα 2 πρώτα calls το checking λειτουργεί as intended. null και undefined => false. To last call παρ' ολα αυτά, ενώ η μεταβλητή val δεν είναι null ούτε undefined, γίνεται απλά evaluate και κατα συνέπεια και το ternary κάνει evaluate σε "false", χάνοντας τον αρχικό σκοπό του (null/undefined checking), το val έχει τιμή, false! (Tip: δες το comment)
migf1 Δημοσ. 21 Οκτωβρίου 2013 Μέλος Δημοσ. 21 Οκτωβρίου 2013 Για να είμαι ειλικρινής, δεν καταλαβαίνω που είναι το πρόβλημα. Καταλαβαίνω δηλαδή ότι προσπαθείς να διαχωρίσεις το false από τα null/undefined, αλλά στην συντριπτική πλειοψηφία των περιπτώσεων (σύμφωνα πάντα με τη δική μου εμπειρία) δεν χρειάζεται αυτός ο διαχωρισμός... αντίθετα θέλουμε τα undefined/null να γίνονται treat ως false (δεν μου έρχεται πρόχειρα τώρα στο μυαλό κάποια περίπτωση που να μας εξυπηρετεί να τα διαχωρίσουμε, σίγουρα υπάρχει αλλά δεν μου έρχεται τώρα... πρόκειται όμως για εξαίρεση). Σίγουρα πάντως στη δική μου συνάρτηση το όρισμα δεν αναμένεται ως boolean. Αναμένεται είτε ως νούμερο είτε ως string ('slow', 'fast') είτε ως "κενό". Αν είναι να το ψειρίσουμε τελείως για αποφυγή οποιουδήποτε bad argument, υποθέτω πρέπει να "μπλέξουμε" με jQuery.type() ή με core javascript. Νομίζω πως για τη συγκεκριμένη συνάρτηση δεν αξίζει τον κόπο.
kagelos Δημοσ. 22 Οκτωβρίου 2013 Δημοσ. 22 Οκτωβρίου 2013 Για μετατροπή μιας μεταβλητής σε πραγματικό boolean μπορεί να χρησιμοποιηθεί και ο τελεστής NOT δύο φορές: var var1 = null; var hasValue = !!var1; //true - false αν το var1 εχει τιμή 1
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα