Lo ammetto, non ho ancora imparato il linguaggio, ma la mia esperienza con esso mi dice che Javascript è un linguaggio molto flessibile, che consente l'ereditarietà prototipale, la digitazione dinamica, funzioni come cittadini di prima classe e così tante altre cose interessanti cose. Penso che tali caratteristiche portino alcune incongruenze, ma non è una novità, la maggior parte delle persone sarebbe d'accordo con me. Volevo discutere di esempi specifici che mi hanno infastidito, come "for in" loops:
for(var role in rolesToAdd){
if(rolesToAdd.hasOwnProperty(role)){
// for body
}
}
Perché dovrei aver bisogno di fare questo? Questo non rompe il concetto di classi ed eredità? Potrei non voler scorrere l'intero prototipo, ma cosa succede se ho ancora bisogno di alcuni degli attributi / metodi dal genitore diretto di un oggetto, per esempio?
Inoltre, sarei molto grato se qualcuno potesse spiegarmi perché l'interprete non consente che anche le variabili globali / locali condividano lo stesso ambito, quando c'è sicuramente un modo in cui potrebbe distinguere l'una dall'altra. Mi piace in:
var foo = function() {
var wth = bar();
var bar = wth;
// body...
}();
function bar(){
return 'bar mitzvah';
}
Si può vedere che, anche se la nostra barra locale è stata dichiarata dopo la chiamata alla nostra barra globale, il valore della barra nell'oscilloscopio di foo rifletterà sempre la barra locale, che manterrà 'indefinito'. Non è uno strano comportamento? Mi piacerebbe se i programmatori senior di Js mi illuminassero su questo e mi mostrassero cosa si ottiene da queste caratteristiche apparentemente strane e se gli svantaggi che ho menzionato qui sono validi.