46 votes

Comment définir un contexte nul dans une fonction d'appel?

 function test(){         
     if(this === null){
        console.log("This is null");
     }else{
         console.log("This is Object");
     }
 }
test.call(null);
test.call({});
 

Sortie:

C'est objet.

C'est objet.

Mais j'attends la sortie:

C'est nul.

C'est objet.

Pourquoi Null n'est pas mis en contexte?

59voto

Tushar Points 23732

Citant le MDN

si la méthode est une fonction non-mode strict, null et undefined sera remplacé par l'objet global et des valeurs primitives seront convertis en objets.

C'est ce qui explique pourquoi vous obtenez un objet lorsque vous appelez test.call(null);. Lors de l' null est passé ici, this à l'intérieur d' test() sera objet global Window.

Pour le comportement désiré, utiliser le mode strict.

function test() {
  "use strict";
  if (this === null) {
    console.log("This is null");
  } else {
    console.log("This is Object");
  }
}
test.call(null);
test.call({});

Citant ES6 Spécifications pour le mode strict

Si this est évaluée dans le mode strict code, puis l' this de la valeur n'est pas contraint à un objet. Un this de la valeur de null ou undefined n'est pas converti à l'objet global et des valeurs primitives ne sont pas convertis à wrapper objets. L' this de la valeur transmise par l'intermédiaire d'un appel de fonction (y compris les appels effectués à l'aide de Function.prototype.apply et Function.prototype.call) n'ont pas contraindre le passé de cette valeur à un objet

4voto

Elnaz Points 1579

Qu'est-ce que le 'ceci' indique? vous pouvez utiliser console.log(this); pour le savoir. Mais comme réponse, utilisez une entrée (ici je l’ai appelée input ) et testez-la.

    function test(input){
 if(input=== null){
    console.log("This is null");
 }else{
     console.log("This is Object");
 }
 }
test(null);
test({}); 

0voto

Josh Adams Points 1477

http://es5.github.io/#x15.3.4.4

REMARQUE Le thisArg valeur est transmise sans modification de la ce de la valeur. C'est un changement à partir de la version 3, où un indéfini ou null thisArg est remplacé par l'objet global et ToObject est appliqué à toutes les autres valeurs et le résultat est transmis comme cette valeur.

Dans votre cas, vous n'êtes pas en mode strict, si vous définissez le mode strict this peut être réglé pour tout ce que vous voulez. Attention tout de même, vous pouvez vous retrouver référencement des choses que vous ne voulez pas par accident.

//global object being set, since this can't be null
function test(){         
     if(this === null){
        console.log("This is null");
     }else{
         console.log("This is Object");
     }
 }
test.call(null);
test.call({});

//example of strict returning null
function test2(){  
"use strict";
     if(this === null){
        console.log("This is null");
     }else{
         console.log("This is Object");
     }
 }
test2.call(null);
test2.call({});

0voto

RAM Points 892

Comme @Tushar mentionné dans sa réponse:

this à l'intérieur d' test() sera objet global Window

.

D'autre part, votre fonction n'a pas d'argument et comme @Elnaz mentionné dans sa réponse, vous pouvez ajouter un argument à elle pour obtenir le nul de l'appelant à l'intérieur de la fonction et je veux ajouter cette note:

Aussi, vous pouvez obtenir de l' null de la valeur de la sortie dans une fonction sans paramètre par arguments[0] lorsque vous appelez votre fonction avec test(null)

function test(){  
     input=arguments[0];       
     if(input === null){
        console.log("This is null");
     }else{
         console.log("This is Object");
     }
 }
test(null);
test({});

Ou avec arguments[1] quand vous l'appelez par test.call(this,null):

function test(){  
     input=arguments[0];       
     if(input === null){
        console.log("This is null");
     }else{
         console.log("This is Object");
     }
 }
test.call(this,null);
test.call(this,{});

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X