2016-09-17 6 views
4

Je voudrais savoir pourquoi l'erreur n'est pas soulevée dans le bloc catch lorsque j'utilise la méthode Object.defineProperty() avec get() et set()?JavaScript essayer ... catch pour defineProperty ne fonctionne pas

try { 
 
     var f; 
 
     Object.defineProperty(window, 'a', { 
 
     get: function() { 
 
      return fxxxxx; // here: undef var but no error catched 
 
     }, 
 
     set: function(v) { 
 
      f = v; 
 
     } 
 
     }); 
 
    } catch (e) { 
 
     console.log('try...catch OK: ', e); 
 
    } 
 
    
 
    a = function() { 
 
     return true; 
 
    } 
 
    window.a(); 
 

 
    // Expected output: "try...catch OK: ReferenceError: fxxxxx is not defined" 
 
    // Console output: "ReferenceError: fxxxxx is not defined"

+0

Merci, Crowder. Et très bonne réponse. – poro6

+1

A l'avenir, il vaut mieux utiliser Stack Snippets (le bouton de barre d'outils '<>') pour créer des démos exécutables sur site plutôt que jsFiddle, qui est hors site. (Ma réponse a un extrait pour que vous puissiez voir à quoi ils ressemblent.) –

+0

Je le ferai la prochaine fois. Merci. – poro6

Répondre

4

Ce n'est pas ReferenceError pour créer une fonction qui fait référence à un symbole qui ne sont pas sans solution au moment où la fonction est créée. L'erreur se produit plus tard, lorsque la fonction est appelée, si le symbole est insoluble à ce moment-là.

Tenir compte, par exemple, que vous pouvez le faire:

try { 
 
    var f; 
 
    Object.defineProperty(window, 'a', { 
 
    get: function() { 
 
     return fxxxxx; 
 
    }, 
 
    set: function(v) { 
 
     f = v; 
 
    } 
 
    }); 
 
} catch (e) { 
 
    console.log('try...catch OK: ', e); 
 
} 
 

 
window.fxxxxx = function() { console.log("Hi there"); }; // <====== Added this 
 

 
a = function() { 
 
    return true; 
 
} 
 
window.a();

qui se connecte "Hi there" parce fxxxxxn'est pas quand sans solution comme la fonction get est appelée.

+0

@Crowder, @Bergi: merci pour votre explication. En outre, try/catch fait le même comportement avec le code qui se trouve dans 'addEventListener' quand l'erreur survient plus tard. – poro6

+1

@ poro6 Oui, c'est la même chose pour toutes les définitions de fonctions. L'exception est créée lorsque la fonction est appelée, et non lorsqu'elle est créée. Peu importe que ce soit une simple déclaration, un getter (comme dans votre question) ou un écouteur d'événements. – Bergi

+0

@Bergi: c'est une règle d'or pour moi. Merci pour votre contribution. – poro6

1

Influence de @ T.J. La réponse de Crowder, si vous voulez essayer d'attraper cette erreur, vous devriez changer votre code comme suit;

var f; 
 
    Object.defineProperty(window, 'a', { 
 
    get: function() { 
 
     try { 
 
     return fxxxxx; // here: undef var but no error catched 
 
     } 
 
     catch(e){console.log("i've got it", e)} 
 
    }, 
 
    set: function(v) { 
 
     f = v; 
 
    } 
 
    }); 
 

 
a = function() { 
 
    return true; 
 
} 
 
window.a;

+1

merci pour votre suggestion. Je le ferai de cette façon. – poro6