8
votes

Comment JQuery Hijack "Ceci"?

Je suis juste curieux de savoir comment JQuery est capable de détourner le mot-clé «Ceci» en JavaScript. Depuis le livre, je lis: "JavaScript Le Guide définitif" indique que "ceci" est un mot clé et vous ne pouvez pas modifier cela comme si vous le pouvez avec un identifiant.

Maintenant, dites que vous êtes dans votre propre constructeur d'objet et que vous appelez un code JQuery, comment est-il capable de vous détourner de vous? p>

function MyObject(){
    // At this point "this" is referring to this object
    $("div").each(function(){
        // Now this refers to the currently matched div
    });
}


0 commentaires

6 Réponses :


1
votes

Cela ne vient rien de rien, cela garantit simplement que "cela" pointe sur ce qu'il veut. Recherchez la fonction "Call" standard disponible pour tout objet de fonction JavaScript.


0 commentaires

1
votes

Voir la documentation de Fonction.Appliquez . Le premier paramètre est le "contexte". Cela peut être n'importe quel objet. Si NULL, il sera scopé globalement.


0 commentaires

16
votes

Vous pouvez modifier le contexte d'une fonction (c.-à-d. La valeur code> cette code>) en l'appelant avec .Call () code> ou .Apply () code > et passer votre contexte prévu comme premier argument.

EG P>

for ( var value = object[0];
      i < length &&
      callback.call( value, i, value ) // <=== LOOK!
      !== false;
      value = object[++i] ) {}


2 commentaires

Notez que la seule différence entre appel () et appliquer () est la manière dont les paramètres de fonction sont transmis. On les prend tous directement en tant que paramètres, l'autre prend une gamme de paramètres.


Vient d'ajouter cette information. Merci frank.



1
votes

La fonction type code> JavaScript est une méthode appelée Apply () code> qui vous permet de spécifier à quel objet ce code> est lié à. Sa signature est la suivante:

function product(name, value)
{
  this.name = name;
  if (value > 1000)
    this.value = 999;
  else
    this.value = value;
}

function prod_dept(name, value, dept)
{
  this.dept = dept;
  product.apply(this, arguments);
}
prod_dept.prototype = new product();

// since 5 is less than 1000 value is set
var cheese = new prod_dept("feta", 5, "food");

// since 5000 is above 1000, value will be 999
var car = new prod_dept("honda", 5000, "auto");


0 commentaires

1
votes

Essayez ceci:

var MyObject = { "Test": "Hello world!" };
(function ()
{
    alert(this.Test); // Gives "Hello world!"
}).call(MyObject);

(function ()
{
    alert(this.Test); // Gives "Hello world!"
}).apply(MyObject);

(function ()
{
    alert(this.Test); // Gives "undefined"
})()


0 commentaires

1
votes

Fonction.apply () et fonction.Call () Vous permet de modifier ce que Ce pointe sur JavaScript. Voici quelques articles utiles qui l'expliquent plus en détail - Portée dans JavaScript et Portée de liaison dans JavaScript


0 commentaires