Pourquoi les travaux suivants:
function sum(a,b) { return a + b; } var result = sum.call(null,3,4); // 7
Pourquoi le résultat est-il défini? J'appelle la somme comme une méthode nulle. Mais null n'est pas un objet et ne peut pas avoir de propriétés!
Que se passe-t-il?
Le premier argument pour Function.prototype.call
est le contexte , qui définit this
valeur pour le contexte d'exécution de la fonction invoquée, rien d'autre.
Donc, fondamentalement, vous dites que this
se réfère à null
(au moins, en mode ES5 stricte), mais comme vous n'êtes pas accessible de toute façon, cela ne fait aucune différence.
En mode non strict, this
ne peut pas être null
, donc il est remplacé par l' objet global à la place.
Lorsque vous utilisez .apply
ou .apply
avec null
ou undefined
, la valeur par défaut (généralement la window
) est automatiquement utilisée à la place si elle n'est pas en mode strict.
De MDN (l'accent est mis):
thisArg
La valeur dethis
prévoyait l'appel aufun
. Notez que ce n'est peut-être pas la valeur réelle observée par la méthode: si la méthode est une fonction dans un code de mode non strict,null
etundefined
sera remplacé par l'objet global et les valeurs primitives seront encadrées.
Si vous êtes en mode strict, il sera effectivement null
ou undefined
.
(function() { 'use strict'; return this; }).call(null); // null
(function() { 'use strict'; return this; })(); // undefined
Ce n'est pas. NULL dans ce cas spécifie à quel objet this
mot-clé est lié. Dans votre méthode, en la définissant sur NULL, elle ne sera pas liée à this
variable ou elle sera liée à la fonction elle-même ou à la fenêtre.
Comme vous n'utilisez pas de variables ou de fonctions auxquelles vous accédez, il n'est pas nécessaire d'utiliser la méthode d'appel … vous pouvez simplement utiliser la sum(3,4)
Comme indiqué dans, par exemple, MDN , le premier argument est
La valeur de celle-ci prévoyait l'appel à [la méthode]. Notez que ce n'est peut-être pas la valeur réelle observée par la méthode: si la méthode est une fonction dans un code de mode non strict, nul et indéfini sera remplacé par l'objet global et les valeurs primitives seront encadrées.
Comme l'a expliqué le MDN.
ThisArg
La valeur de celle-ci prévoyait l'appel au plaisir. Notez que ce n'est peut-être pas la valeur réelle observée par la méthode: si la méthode est une fonction dans un code de mode non strict, nul et indéfini sera remplacé par l'objet global et les valeurs primitives seront encadrées.
Il suffit de le mettre par un petit code.
<script > 'use strict' function fun() { alert(this); } fun.call(null); </script>
En mode strict, ceci est nul. Mais dans le mode non strict. Il s'agit d'une fenêtre ou d'un objet global.