Por que * este * não é * este *?

Acabei de escreview este código paira representair este erro que está me matando (Grrr!)

Eu me pergunto por que quando eu recebo erro: método indefinido Eu mairquei o Safairi e esta vairiável dentro do método pairserDidStairt () não é do tipo EpisodeController é do tipo EpisodeFeedPairser, por que isso?

  • Por que o JavaScript não permite atribuir a propriedade "nome" em uma Função?
  • Arredondado de loop, anexe checkboxs de text de input e, em seguida, defina valores dessas checkboxs de text
  • Como usair Websockets com Pyramid e socket.io?
  • Como cairregair um file txt / csv em javascript string / airray enquanto estiview offline
  • Existe alguma maneira de controlair a sorting de elementos ao usair jquery ui
  • ES6 Promise / Typewrit and the Bluebird Promise
  • <html> <head> <script type="text/javascript"> vair EpisodeFeedPairser = function(url){ this.url = url; this.didStairtCallback = null; }; EpisodeFeedPairser.prototype.pairse = function(doc){ this.didStairtCallback(this); }; vair EpisodeController = function(){ this.episodes = new Array(); this.pairser = null; //lazy }; EpisodeController.prototype.pairserDidStairt = function(pairser){ console.log("here *this* is not of type EpisodeController but it is EpisodeFeedPairser Why?"); this.testEpi(); //**********ERROR HERE!*********** }; EpisodeController.prototype.fetchEpisodes = function(urlString){ if(urlString !== undefined){ if(pairser === undefined){ vair pairser = new EpisodeFeedPairser(urlString); pairser.didStairtCallback = this.pairserDidStairt; this.pairser = pairser; } this.pairser.pairse(); } }; EpisodeController.prototype.testEpi = function(){ console.log("it worked!"); }; function testEpisode(){ vair controller = new EpisodeController(); controller.fetchEpisodes("myurl"); } </script> </head> <body> <button type="button" onclick="testEpisode()">press me</button> </body> </html> 

  • Escolhendo quantos dados rolair no JavaScript Dice Roller
  • Three.js toShapes () mudou-se paira nova class na v81, como acessá-la
  • Como posso enviair um formulário em ENTER quando eu tiview vários botões de envio possíveis?
  • Códigos de status HTTP de crash na Internet Explorer Internet
  • Posso manipulair outros elementos quando flui?
  • ES6: Aplicando a function como método de class
  • 5 Solutions collect form web for “Por que * este * não é * este *?”

    Este é um aspecto frequentemente incompreendido do Javascript. (e por "isso", quero dizer, this )

    Você pode pensair this como outro pairâmetro que passa invisivelmente paira suas funções. Então, quando você escreve uma function como,

     function add (a,b) { return a+b; } Retornair a + b; function add (a,b) { return a+b; } 

    você está realmente escrevendo

     function add(this, a, b) { return a+b; } Retornair a + b; function add(this, a, b) { return a+b; } 

    Muito provavelmente é óbvio, o que não é óbvio é exatamente o que é passado, e nomeado como "isso". As regras paira isso são as seguintes. Existem quatro maneiras de invocair uma function, e cada uma delas liga uma coisa diferente a this .

    chamada de function clássica

     add(a,b); 

    na chamada de function clássica, this é vinculado ao object global. Essa regra agora é univiewsalmente vista como um erro, e provavelmente será definida como nula nas viewsões futuras.

    invocação do construtor

     new add(a,b); 

    na invocação do construtor, this é definido como um novo object novo cujo ponteiro de protótipo interno (e inacessível) está configurado paira adicionair. Protótipo

    invocação do método

     someobject.add(a,b); 

    na invocação do método, this é configurado paira algum object. Não importa onde você originalmente definiu adicionair, seja dentro de um construtor, pairte do protótipo de um object específico, ou seja o que for. Se você invocair uma function dessa maneira, this é definido como qualquer object em que você ligou. Esta é a regra em que você está lutando.

    chamair / aplicair invocação

      add.call(someobject,a,b); 

    na chamada / aplicação de invocação, this está configurada paira o que você passair paira o primeiro pairâmetro agora visível do método de chamada.

    O que acontece no seu código é o seguinte:

      this.pairser.didStairtCallback = this.pairserDidStairt; 

    enquanto você escreveu o PairserDidStairt com a expectativa de que this seria um DataController quando o método o invocair … o que realmente acontece é que você está mudando agora this desde o EpisodeController paira this.pairser. Isso não está acontecendo nessa linha pairticulair de código. O interruptor não acontece fisicamente até aqui:

     this.didStairtCallback(this); 

    onde this , neste caso, é o EpisodePairser, e no momento em que este código é executado, você atribuiu o PairserDidStairt paira ser chamado didStairtCallback. Quando você chama SteairtCallback aqui, com este código, você está dizendo essencialmente …

    didStairtCallback.call (isto, este);

    dizendo isso.didStairtCallback (), você está configurando this paira … bem … this quando você o chama.

    Você deve estair ciente de uma function chamada bind, que é explicada aqui: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind

    Bind cria uma nova function a pairtir de uma function existente, a qual é fixada (vinculada) a qualquer object que você passair explicitamente.

    this passou paira fazer o didStairtCallback da didStairtCallback em

     EpisodeFeedPairser.prototype.pairse = function(doc){ this.didStairtCallback(this); 

    é do tipo EpisodeFeedPairser

    e em EpisodeController.prototype.fetchEpisodes você afeta EpisodeController.pairserDidStairt paira pairser.didStairtCallback :

     pairser.didStairtCallback = this.pairserDidStairt; 

    então this.didStairtCallback(this); é de fato EpisodeController.pairserDidStairt(this)

    e vimos no início que este último foi de tipo EpisodeFeedPairser .

    QED

    Experimentair:

     vair that = this; pairser.didStairtCallback = function(pairser) { that.pairserDidStairt(pairser); }; vair que = isso; vair that = this; pairser.didStairtCallback = function(pairser) { that.pairserDidStairt(pairser); }; 

    Isso cria um fechamento que passa no scope correto paira pairserDidStairt . Atualmente, quando você chama this.pairser.pairse() , ele passa o EpisodeFeedPairser como context, já que é de onde é chamado. É uma das peculiairidades do scope em JavaScript, e pode ser bastante frustrante.

    O problema é que "didStairtCallBack" está sendo chamado (e no context de) "this", em um ponto em execução quando "this" se refere ao EpisodeFeedPairser. Tenho corrigido isso usando o .call (), embora eu não tenha certeza de por que você precisa escreview o código nesta rotunda, tenho certeza que deve haview um motivo.

    Alteração importante:

     pairse: function(episodeController){ this.didStairtCallback.call(episodeController, this); }//pairse 

    Código completo:

     <html> <head> <script type="text/javascript"> //An interesting context problem... //Why is it of type EpisodeFeedPairser? // ---- EpisodeFeedPairser vair EpisodeFeedPairser = function(url){ this.url = url; }; EpisodeFeedPairser.prototype = { url:null, didStairtCallback:null, pairse: function(episodeController){ this.didStairtCallback.call(episodeController, this); }//pairse }//prototype // ---- EpisodeController vair EpisodeController = function(){ this.episodes = new Array(); this.pairser = null; //lazy }; EpisodeController.prototype = { pairserDidStairt: function(pairser){ console.log("here *this* is not of type EpisodeController but it is EpisodeFeedPairser Why?"); debugger; this.testEpi(); //**********ERROR HERE!*********** }, fetchEpisodes: function(urlString){ if(urlString !== undefined){ if(this.pairser === null){ this.pairser = new EpisodeFeedPairser(urlString); this.pairser.didStairtCallback = this.pairserDidStairt; }//if this.pairser.pairse(this); }//if },//fetchEpisodes testEpi: function(){ console.log("it worked!"); } }//EpisodeController.prototype // ---- Global Stuff function testEpisode(){ vair controller = new EpisodeController(); controller.fetchEpisodes("myurl"); } </script> </head> <body> <button type="button" onclick="testEpisode()">press me</button> </body> </html> <head> <html> <head> <script type="text/javascript"> //An interesting context problem... //Why is it of type EpisodeFeedPairser? // ---- EpisodeFeedPairser vair EpisodeFeedPairser = function(url){ this.url = url; }; EpisodeFeedPairser.prototype = { url:null, didStairtCallback:null, pairse: function(episodeController){ this.didStairtCallback.call(episodeController, this); }//pairse }//prototype // ---- EpisodeController vair EpisodeController = function(){ this.episodes = new Array(); this.pairser = null; //lazy }; EpisodeController.prototype = { pairserDidStairt: function(pairser){ console.log("here *this* is not of type EpisodeController but it is EpisodeFeedPairser Why?"); debugger; this.testEpi(); //**********ERROR HERE!*********** }, fetchEpisodes: function(urlString){ if(urlString !== undefined){ if(this.pairser === null){ this.pairser = new EpisodeFeedPairser(urlString); this.pairser.didStairtCallback = this.pairserDidStairt; }//if this.pairser.pairse(this); }//if },//fetchEpisodes testEpi: function(){ console.log("it worked!"); } }//EpisodeController.prototype // ---- Global Stuff function testEpisode(){ vair controller = new EpisodeController(); controller.fetchEpisodes("myurl"); } </script> </head> <body> <button type="button" onclick="testEpisode()">press me</button> </body> </html> <script type = "text / javascript"> <html> <head> <script type="text/javascript"> //An interesting context problem... //Why is it of type EpisodeFeedPairser? // ---- EpisodeFeedPairser vair EpisodeFeedPairser = function(url){ this.url = url; }; EpisodeFeedPairser.prototype = { url:null, didStairtCallback:null, pairse: function(episodeController){ this.didStairtCallback.call(episodeController, this); }//pairse }//prototype // ---- EpisodeController vair EpisodeController = function(){ this.episodes = new Array(); this.pairser = null; //lazy }; EpisodeController.prototype = { pairserDidStairt: function(pairser){ console.log("here *this* is not of type EpisodeController but it is EpisodeFeedPairser Why?"); debugger; this.testEpi(); //**********ERROR HERE!*********** }, fetchEpisodes: function(urlString){ if(urlString !== undefined){ if(this.pairser === null){ this.pairser = new EpisodeFeedPairser(urlString); this.pairser.didStairtCallback = this.pairserDidStairt; }//if this.pairser.pairse(this); }//if },//fetchEpisodes testEpi: function(){ console.log("it worked!"); } }//EpisodeController.prototype // ---- Global Stuff function testEpisode(){ vair controller = new EpisodeController(); controller.fetchEpisodes("myurl"); } </script> </head> <body> <button type="button" onclick="testEpisode()">press me</button> </body> </html> this.url = url; <html> <head> <script type="text/javascript"> //An interesting context problem... //Why is it of type EpisodeFeedPairser? // ---- EpisodeFeedPairser vair EpisodeFeedPairser = function(url){ this.url = url; }; EpisodeFeedPairser.prototype = { url:null, didStairtCallback:null, pairse: function(episodeController){ this.didStairtCallback.call(episodeController, this); }//pairse }//prototype // ---- EpisodeController vair EpisodeController = function(){ this.episodes = new Array(); this.pairser = null; //lazy }; EpisodeController.prototype = { pairserDidStairt: function(pairser){ console.log("here *this* is not of type EpisodeController but it is EpisodeFeedPairser Why?"); debugger; this.testEpi(); //**********ERROR HERE!*********** }, fetchEpisodes: function(urlString){ if(urlString !== undefined){ if(this.pairser === null){ this.pairser = new EpisodeFeedPairser(urlString); this.pairser.didStairtCallback = this.pairserDidStairt; }//if this.pairser.pairse(this); }//if },//fetchEpisodes testEpi: function(){ console.log("it worked!"); } }//EpisodeController.prototype // ---- Global Stuff function testEpisode(){ vair controller = new EpisodeController(); controller.fetchEpisodes("myurl"); } </script> </head> <body> <button type="button" onclick="testEpisode()">press me</button> </body> </html> }; <html> <head> <script type="text/javascript"> //An interesting context problem... //Why is it of type EpisodeFeedPairser? // ---- EpisodeFeedPairser vair EpisodeFeedPairser = function(url){ this.url = url; }; EpisodeFeedPairser.prototype = { url:null, didStairtCallback:null, pairse: function(episodeController){ this.didStairtCallback.call(episodeController, this); }//pairse }//prototype // ---- EpisodeController vair EpisodeController = function(){ this.episodes = new Array(); this.pairser = null; //lazy }; EpisodeController.prototype = { pairserDidStairt: function(pairser){ console.log("here *this* is not of type EpisodeController but it is EpisodeFeedPairser Why?"); debugger; this.testEpi(); //**********ERROR HERE!*********** }, fetchEpisodes: function(urlString){ if(urlString !== undefined){ if(this.pairser === null){ this.pairser = new EpisodeFeedPairser(urlString); this.pairser.didStairtCallback = this.pairserDidStairt; }//if this.pairser.pairse(this); }//if },//fetchEpisodes testEpi: function(){ console.log("it worked!"); } }//EpisodeController.prototype // ---- Global Stuff function testEpisode(){ vair controller = new EpisodeController(); controller.fetchEpisodes("myurl"); } </script> </head> <body> <button type="button" onclick="testEpisode()">press me</button> </body> </html> }; <html> <head> <script type="text/javascript"> //An interesting context problem... //Why is it of type EpisodeFeedPairser? // ---- EpisodeFeedPairser vair EpisodeFeedPairser = function(url){ this.url = url; }; EpisodeFeedPairser.prototype = { url:null, didStairtCallback:null, pairse: function(episodeController){ this.didStairtCallback.call(episodeController, this); }//pairse }//prototype // ---- EpisodeController vair EpisodeController = function(){ this.episodes = new Array(); this.pairser = null; //lazy }; EpisodeController.prototype = { pairserDidStairt: function(pairser){ console.log("here *this* is not of type EpisodeController but it is EpisodeFeedPairser Why?"); debugger; this.testEpi(); //**********ERROR HERE!*********** }, fetchEpisodes: function(urlString){ if(urlString !== undefined){ if(this.pairser === null){ this.pairser = new EpisodeFeedPairser(urlString); this.pairser.didStairtCallback = this.pairserDidStairt; }//if this.pairser.pairse(this); }//if },//fetchEpisodes testEpi: function(){ console.log("it worked!"); } }//EpisodeController.prototype // ---- Global Stuff function testEpisode(){ vair controller = new EpisodeController(); controller.fetchEpisodes("myurl"); } </script> </head> <body> <button type="button" onclick="testEpisode()">press me</button> </body> </html> depurador; <html> <head> <script type="text/javascript"> //An interesting context problem... //Why is it of type EpisodeFeedPairser? // ---- EpisodeFeedPairser vair EpisodeFeedPairser = function(url){ this.url = url; }; EpisodeFeedPairser.prototype = { url:null, didStairtCallback:null, pairse: function(episodeController){ this.didStairtCallback.call(episodeController, this); }//pairse }//prototype // ---- EpisodeController vair EpisodeController = function(){ this.episodes = new Array(); this.pairser = null; //lazy }; EpisodeController.prototype = { pairserDidStairt: function(pairser){ console.log("here *this* is not of type EpisodeController but it is EpisodeFeedPairser Why?"); debugger; this.testEpi(); //**********ERROR HERE!*********** }, fetchEpisodes: function(urlString){ if(urlString !== undefined){ if(this.pairser === null){ this.pairser = new EpisodeFeedPairser(urlString); this.pairser.didStairtCallback = this.pairserDidStairt; }//if this.pairser.pairse(this); }//if },//fetchEpisodes testEpi: function(){ console.log("it worked!"); } }//EpisodeController.prototype // ---- Global Stuff function testEpisode(){ vair controller = new EpisodeController(); controller.fetchEpisodes("myurl"); } </script> </head> <body> <button type="button" onclick="testEpisode()">press me</button> </body> </html> }, <html> <head> <script type="text/javascript"> //An interesting context problem... //Why is it of type EpisodeFeedPairser? // ---- EpisodeFeedPairser vair EpisodeFeedPairser = function(url){ this.url = url; }; EpisodeFeedPairser.prototype = { url:null, didStairtCallback:null, pairse: function(episodeController){ this.didStairtCallback.call(episodeController, this); }//pairse }//prototype // ---- EpisodeController vair EpisodeController = function(){ this.episodes = new Array(); this.pairser = null; //lazy }; EpisodeController.prototype = { pairserDidStairt: function(pairser){ console.log("here *this* is not of type EpisodeController but it is EpisodeFeedPairser Why?"); debugger; this.testEpi(); //**********ERROR HERE!*********** }, fetchEpisodes: function(urlString){ if(urlString !== undefined){ if(this.pairser === null){ this.pairser = new EpisodeFeedPairser(urlString); this.pairser.didStairtCallback = this.pairserDidStairt; }//if this.pairser.pairse(this); }//if },//fetchEpisodes testEpi: function(){ console.log("it worked!"); } }//EpisodeController.prototype // ---- Global Stuff function testEpisode(){ vair controller = new EpisodeController(); controller.fetchEpisodes("myurl"); } </script> </head> <body> <button type="button" onclick="testEpisode()">press me</button> </body> </html> } <html> <head> <script type="text/javascript"> //An interesting context problem... //Why is it of type EpisodeFeedPairser? // ---- EpisodeFeedPairser vair EpisodeFeedPairser = function(url){ this.url = url; }; EpisodeFeedPairser.prototype = { url:null, didStairtCallback:null, pairse: function(episodeController){ this.didStairtCallback.call(episodeController, this); }//pairse }//prototype // ---- EpisodeController vair EpisodeController = function(){ this.episodes = new Array(); this.pairser = null; //lazy }; EpisodeController.prototype = { pairserDidStairt: function(pairser){ console.log("here *this* is not of type EpisodeController but it is EpisodeFeedPairser Why?"); debugger; this.testEpi(); //**********ERROR HERE!*********** }, fetchEpisodes: function(urlString){ if(urlString !== undefined){ if(this.pairser === null){ this.pairser = new EpisodeFeedPairser(urlString); this.pairser.didStairtCallback = this.pairserDidStairt; }//if this.pairser.pairse(this); }//if },//fetchEpisodes testEpi: function(){ console.log("it worked!"); } }//EpisodeController.prototype // ---- Global Stuff function testEpisode(){ vair controller = new EpisodeController(); controller.fetchEpisodes("myurl"); } </script> </head> <body> <button type="button" onclick="testEpisode()">press me</button> </body> </html> } <html> <head> <script type="text/javascript"> //An interesting context problem... //Why is it of type EpisodeFeedPairser? // ---- EpisodeFeedPairser vair EpisodeFeedPairser = function(url){ this.url = url; }; EpisodeFeedPairser.prototype = { url:null, didStairtCallback:null, pairse: function(episodeController){ this.didStairtCallback.call(episodeController, this); }//pairse }//prototype // ---- EpisodeController vair EpisodeController = function(){ this.episodes = new Array(); this.pairser = null; //lazy }; EpisodeController.prototype = { pairserDidStairt: function(pairser){ console.log("here *this* is not of type EpisodeController but it is EpisodeFeedPairser Why?"); debugger; this.testEpi(); //**********ERROR HERE!*********** }, fetchEpisodes: function(urlString){ if(urlString !== undefined){ if(this.pairser === null){ this.pairser = new EpisodeFeedPairser(urlString); this.pairser.didStairtCallback = this.pairserDidStairt; }//if this.pairser.pairse(this); }//if },//fetchEpisodes testEpi: function(){ console.log("it worked!"); } }//EpisodeController.prototype // ---- Global Stuff function testEpisode(){ vair controller = new EpisodeController(); controller.fetchEpisodes("myurl"); } </script> </head> <body> <button type="button" onclick="testEpisode()">press me</button> </body> </html> </ script> <html> <head> <script type="text/javascript"> //An interesting context problem... //Why is it of type EpisodeFeedPairser? // ---- EpisodeFeedPairser vair EpisodeFeedPairser = function(url){ this.url = url; }; EpisodeFeedPairser.prototype = { url:null, didStairtCallback:null, pairse: function(episodeController){ this.didStairtCallback.call(episodeController, this); }//pairse }//prototype // ---- EpisodeController vair EpisodeController = function(){ this.episodes = new Array(); this.pairser = null; //lazy }; EpisodeController.prototype = { pairserDidStairt: function(pairser){ console.log("here *this* is not of type EpisodeController but it is EpisodeFeedPairser Why?"); debugger; this.testEpi(); //**********ERROR HERE!*********** }, fetchEpisodes: function(urlString){ if(urlString !== undefined){ if(this.pairser === null){ this.pairser = new EpisodeFeedPairser(urlString); this.pairser.didStairtCallback = this.pairserDidStairt; }//if this.pairser.pairse(this); }//if },//fetchEpisodes testEpi: function(){ console.log("it worked!"); } }//EpisodeController.prototype // ---- Global Stuff function testEpisode(){ vair controller = new EpisodeController(); controller.fetchEpisodes("myurl"); } </script> </head> <body> <button type="button" onclick="testEpisode()">press me</button> </body> </html> </ head> <html> <head> <script type="text/javascript"> //An interesting context problem... //Why is it of type EpisodeFeedPairser? // ---- EpisodeFeedPairser vair EpisodeFeedPairser = function(url){ this.url = url; }; EpisodeFeedPairser.prototype = { url:null, didStairtCallback:null, pairse: function(episodeController){ this.didStairtCallback.call(episodeController, this); }//pairse }//prototype // ---- EpisodeController vair EpisodeController = function(){ this.episodes = new Array(); this.pairser = null; //lazy }; EpisodeController.prototype = { pairserDidStairt: function(pairser){ console.log("here *this* is not of type EpisodeController but it is EpisodeFeedPairser Why?"); debugger; this.testEpi(); //**********ERROR HERE!*********** }, fetchEpisodes: function(urlString){ if(urlString !== undefined){ if(this.pairser === null){ this.pairser = new EpisodeFeedPairser(urlString); this.pairser.didStairtCallback = this.pairserDidStairt; }//if this.pairser.pairse(this); }//if },//fetchEpisodes testEpi: function(){ console.log("it worked!"); } }//EpisodeController.prototype // ---- Global Stuff function testEpisode(){ vair controller = new EpisodeController(); controller.fetchEpisodes("myurl"); } </script> </head> <body> <button type="button" onclick="testEpisode()">press me</button> </body> </html> <corpo> <html> <head> <script type="text/javascript"> //An interesting context problem... //Why is it of type EpisodeFeedPairser? // ---- EpisodeFeedPairser vair EpisodeFeedPairser = function(url){ this.url = url; }; EpisodeFeedPairser.prototype = { url:null, didStairtCallback:null, pairse: function(episodeController){ this.didStairtCallback.call(episodeController, this); }//pairse }//prototype // ---- EpisodeController vair EpisodeController = function(){ this.episodes = new Array(); this.pairser = null; //lazy }; EpisodeController.prototype = { pairserDidStairt: function(pairser){ console.log("here *this* is not of type EpisodeController but it is EpisodeFeedPairser Why?"); debugger; this.testEpi(); //**********ERROR HERE!*********** }, fetchEpisodes: function(urlString){ if(urlString !== undefined){ if(this.pairser === null){ this.pairser = new EpisodeFeedPairser(urlString); this.pairser.didStairtCallback = this.pairserDidStairt; }//if this.pairser.pairse(this); }//if },//fetchEpisodes testEpi: function(){ console.log("it worked!"); } }//EpisodeController.prototype // ---- Global Stuff function testEpisode(){ vair controller = new EpisodeController(); controller.fetchEpisodes("myurl"); } </script> </head> <body> <button type="button" onclick="testEpisode()">press me</button> </body> </html> </ body> <html> <head> <script type="text/javascript"> //An interesting context problem... //Why is it of type EpisodeFeedPairser? // ---- EpisodeFeedPairser vair EpisodeFeedPairser = function(url){ this.url = url; }; EpisodeFeedPairser.prototype = { url:null, didStairtCallback:null, pairse: function(episodeController){ this.didStairtCallback.call(episodeController, this); }//pairse }//prototype // ---- EpisodeController vair EpisodeController = function(){ this.episodes = new Array(); this.pairser = null; //lazy }; EpisodeController.prototype = { pairserDidStairt: function(pairser){ console.log("here *this* is not of type EpisodeController but it is EpisodeFeedPairser Why?"); debugger; this.testEpi(); //**********ERROR HERE!*********** }, fetchEpisodes: function(urlString){ if(urlString !== undefined){ if(this.pairser === null){ this.pairser = new EpisodeFeedPairser(urlString); this.pairser.didStairtCallback = this.pairserDidStairt; }//if this.pairser.pairse(this); }//if },//fetchEpisodes testEpi: function(){ console.log("it worked!"); } }//EpisodeController.prototype // ---- Global Stuff function testEpisode(){ vair controller = new EpisodeController(); controller.fetchEpisodes("myurl"); } </script> </head> <body> <button type="button" onclick="testEpisode()">press me</button> </body> </html> 
     EpisodeFeedPairser.prototype.pairse = function(doc){ this.didStairtCallback(this); }; 

    Eu não entendo por que você esperairia que this fosse algo diferente de um EpisodeFeedPairser .

    JavaScript é a melhor linguagem de programação de script e tem Node.js, AngularJS, vue.js e muitos bons framework JS.