Les fonctions d'objet JavaScript et `this` sont non liées et retournées dans expression / parens

Les lignes 1-2 et 4-5 ont du sens en ce qui concerne this retour. Qu'est-ce que je manque à propos de la ligne 3? Je pensais que cela donnerait une window semblable aux lignes 4-5. Y a-t-il un autre modèle qui ne pourrait pas démontrer pourquoi?

 foo = { bar : function () { return this } } foo.bar() // ==> foo (foo.bar)() // ==> foo / but why? (foo.bar ? foo.bar : $.noop)() // ==> window (foo.bar || 0)() // ==> window 

L'opérateur de groupement ne détruit pas les références de propriété, ce qui provoque l'appel de méthode .

Ceci est explicitement mentionné dans la spécification :

REMARQUE: cet algorithme n'applique pas GetValue au résultat de l'évaluation d' Expression . La motivation principale est que les opérateurs tels que delete et typeof peuvent être appliqués aux expressions typeof .

Dans vos lignes 4 et 5, ce n'est pas la parenthèse, mais les opérateurs ( ?: Et || ) qui désorientent la propriété et produisent la fonction "non liée".

foo.bar voici une fonction anonyme.

Il pourrait avoir plus de sens si vous le divisez en différentes lignes:

 foo = { bar: function() { return this; } } 

Donc, lorsque vous appelez foo.bar , vous obtenez la function() { return this; } function() { return this; } . Sur la ligne deux, vous appelez cette fonction directement ( foo.bar() ), donc elle renvoie this , l'instance de l'objet ( foo ).

Sur la ligne trois, vous obtenez le même résultat parce que vous ne demandez pas seulement la fonction anonyme, mais que vous exécutez cette fonction également:

 (foo.bar); // (function() { return this; }); A reference to the function (foo.bar)(); // (function() { return this; })(); Actually calling the function 

Parce que dans ce dernier cas, vous exécutez la fonction comme vous l'avez fait dans la ligne deux, le résultat est le même ( foo ).

Dans les lignes quatre et cinq, cependant, comme l'a dit Bergi, les opérateurs que vous utilisez les désélectionnent à partir de la fonction, ce qui vous laisse avec un objet Window plutôt que foo .