Maison interface Web js tutoriel Astuce Function.prototye.bind_javascript en javascript

Astuce Function.prototye.bind_javascript en javascript

May 16, 2016 pm 03:52 PM
javascript

La liaison de fonction est probablement la chose à laquelle vous prêtez le moins d'attention lorsque vous commencez à utiliser JavaScript, mais lorsque vous réalisez que vous avez besoin d'une solution pour maintenir ce contexte dans une autre fonction, vous avez vraiment besoin de Function.prototype. bind(), mais vous ne vous en rendez peut-être toujours pas compte.

La première fois que vous rencontrez ce problème, vous pourriez être tenté de le définir sur une variable afin de pouvoir continuer à y faire référence après avoir changé le contexte. De nombreuses personnes choisissent d'utiliser self, _this ou context comme noms de variables (certains l'utilisent également). Ces méthodes sont toutes utiles et bien sûr, il n’y a rien de mal à elles. Mais il existe une méthode meilleure et plus spécialisée.

Quel est le vrai problème que nous devons résoudre ?
Dans l'exemple de code suivant, nous pouvons légitimement mettre en cache le contexte dans une variable :

var myObj = {
 
  specialFunction: function () {
 
  },
 
  anotherSpecialFunction: function () {
 
  },
 
  getAsyncData: function (cb) {
    cb();
  },
 
  render: function () {
    var that = this;
    this.getAsyncData(function () {
      that.specialFunction();
      that.anotherSpecialFunction();
    });
  }
};
 
myObj.render();

Copier après la connexion

Si nous utilisons simplement this.specialFunction() pour appeler la méthode, nous recevrons l'erreur suivante :

Uncaught TypeError : l'objet [object global] n'a pas de méthode 'specialFunction'
Nous devons conserver une référence au contexte de l'objet myObj pour l'exécution de la fonction de rappel. Appeler that.specialFunction() nous permet de maintenir le contexte de portée et d'exécuter notre fonction correctement. Cependant, il existe un moyen plus simple et plus propre d'utiliser Function.prototype.bind() :

render: function () {
 
  this.getAsyncData(function () {
 
    this.specialFunction();
 
    this.anotherSpecialFunction();
 
  }.bind(this));
 
}

Copier après la connexion

Qu'est-ce qu'on vient de faire ?
.bind() crée une fonction. Lorsque cette fonction est appelée, son mot-clé this sera défini sur la valeur transmise (fait référence ici au paramètre transmis lors de l'appel de bind()). On passe donc dans le contexte souhaité, this (en fait myObj), à la fonction .bind(). Ensuite, lorsque la fonction de rappel est exécutée, elle pointe vers l'objet myObj.

Si vous souhaitez savoir à quoi ressemble Function.prototype.bind() en interne et comment cela fonctionne, voici un exemple très simple :

Function.prototype.bind = function (scope) {
  var fn = this;
  return function () {
    return fn.apply(scope);
  };
}
Copier après la connexion

Il existe également un cas d'utilisation très simple :

var foo = {
  x: 3
}
 
var bar = function(){
  console.log(this.x);
}
 
bar(); 
// undefined
 
var boundFunc = bar.bind(foo);
 
boundFunc(); 
// 3
Copier après la connexion

Nous créons une nouvelle fonction, et lorsqu'elle sera exécutée, elle sera définie sur foo - pas sur la portée globale comme lorsque nous avons appelé bar().

Prise en charge du navigateur
Prise en charge de la version du navigateur
Chrome 7
Firefox (Gecko) 4.0 (2)
Internet Explorer 9
Opéra 11h60
Safari 5.1.4
Comme vous pouvez le constater, Function.prototype.bind n'est malheureusement pas pris en charge dans IE8 et versions antérieures, donc si vous n'avez pas de solution de secours, vous risquez de rencontrer des problèmes.

Heureusement, le Mozilla Developer Network (une excellente bibliothèque de ressources) fournit une alternative solide pour les navigateurs qui n'implémentent pas eux-mêmes la méthode .bind() :

if (!Function.prototype.bind) {
 Function.prototype.bind = function (oThis) {
  if (typeof this !== "function") {
   
// closest thing possible to the ECMAScript 5 internal IsCallable function
   throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");
  }
 
  var aArgs = Array.prototype.slice.call(arguments, 1), 
    fToBind = this, 
    fNOP = function () {},
    fBound = function () {
     return fToBind.apply(this instanceof fNOP && oThis
                 ? this
                 : oThis,
                aArgs.concat(Array.prototype.slice.call(arguments)));
    };
 
  fNOP.prototype = this.prototype;
  fBound.prototype = new fNOP();
 
  return fBound;
 };
}

Copier après la connexion

Modes applicables

Lors de l'apprentissage des points techniques, j'ai trouvé que ce qui est utile n'est pas seulement d'étudier et de comprendre en profondeur le concept, mais aussi de voir s'il y a une application dans le travail en cours, ou quelque chose de proche. J'espère que certains des exemples ci-dessous s'appliqueront à votre code ou résoudront les problèmes auxquels vous êtes confronté.

Gestionnaires de clics (fonction de gestionnaire de clics)
Une utilisation consiste à enregistrer un événement de clic (ou à effectuer une action après un clic), ce qui peut nous obliger à stocker certaines informations dans un objet, telles que :

var logger = {
  x: 0,    
  updateCount: function(){
    this.x++;
    console.log(this.x);
  }
}

Copier après la connexion

Nous pouvons spécifier la fonction de traitement des clics de la manière suivante, puis appeler la méthode updateCount() dans l'objet logger.

document.querySelector('button').addEventListener('click', function(){
  logger.updateCount();
});
Copier après la connexion

Mais nous devons créer une fonction anonyme supplémentaire pour garantir que le mot-clé this dans la fonction updateCount() a la valeur correcte.

Nous pouvons utiliser la méthode plus propre suivante :

document.querySelector('button').addEventListener('click', logger.updateCount.bind(logger));
Nous utilisons intelligemment la fonction pratique .bind() pour créer une nouvelle fonction et lier sa portée à l'objet enregistreur.

SETTIMEOUT
Si vous avez utilisé un moteur de modèles (tel que guidon) ou en particulier certains des frameworks MV* (d'après mon expérience, je ne peux parler que de Backbone.js), alors vous connaissez peut-être la discussion ci-dessous sur l'accès au nouveau DOM immédiatement après le rendu du template Problèmes rencontrés lors de l'utilisation des nœuds.

Supposons que nous voulions instancier un plugin jQuery :

var myView = {
 
  template: '/* 一个包含 <select /> 的模板字符串*/',
 
  $el: $('#content'),
 
  afterRender: function () {
    this.$el.find('select').myPlugin();
  },
 
  render: function () {
    this.$el.html(this.template());
    this.afterRender();
  }
}
 
myView.render();

Copier après la connexion

Vous constaterez peut-être que cela fonctionne - mais pas à chaque fois car il y a des problèmes. C'est une question de compétition : celui qui arrive le premier gagne. Parfois le rendu vient en premier, et parfois l’instanciation du plugin vient en premier. [Note du traducteur : si le processus de rendu n'est pas terminé (le nœud DOM n'a pas été ajouté à l'arborescence DOM), alors find('select') ne pourra pas trouver le nœud correspondant pour effectuer l'instanciation. 】

Maintenant, peut-être que peu de gens le savent, nous pouvons utiliser un léger hack basé sur setTimeout() pour résoudre le problème.

Réécrivons légèrement notre code pour instancier en toute sécurité notre plug-in jQuery après le chargement du nœud DOM :

afterRender: function () {
    this.$el.find('select').myPlugin();
  },
 
  render: function () {
    this.$el.html(this.template());
    setTimeout(this.afterRender, 0);    
  }

Copier après la connexion

然而,我们获得的是 函数 .afterRender() 不能找到 的错误信息。

我们接下来要做的,就是将.bind()使用到我们的代码中:

//
 
  afterRender: function () {
    this.$el.find('select').myPlugin();
  },
 
  render: function () {
    this.$el.html(this.template());
    setTimeout(this.afterRender.bind(this), 0);    
  }
 
//
Copier après la connexion

以上所述就是本文的全部内容了,希望大家能够喜欢。

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment mettre en œuvre un système de reconnaissance vocale en ligne à l'aide de WebSocket et JavaScript Comment mettre en œuvre un système de reconnaissance vocale en ligne à l'aide de WebSocket et JavaScript Dec 17, 2023 pm 02:54 PM

Comment utiliser WebSocket et JavaScript pour mettre en œuvre un système de reconnaissance vocale en ligne Introduction : Avec le développement continu de la technologie, la technologie de reconnaissance vocale est devenue une partie importante du domaine de l'intelligence artificielle. Le système de reconnaissance vocale en ligne basé sur WebSocket et JavaScript présente les caractéristiques d'une faible latence, d'un temps réel et d'une multiplateforme, et est devenu une solution largement utilisée. Cet article explique comment utiliser WebSocket et JavaScript pour implémenter un système de reconnaissance vocale en ligne.

WebSocket et JavaScript : technologies clés pour mettre en œuvre des systèmes de surveillance en temps réel WebSocket et JavaScript : technologies clés pour mettre en œuvre des systèmes de surveillance en temps réel Dec 17, 2023 pm 05:30 PM

WebSocket et JavaScript : technologies clés pour réaliser des systèmes de surveillance en temps réel Introduction : Avec le développement rapide de la technologie Internet, les systèmes de surveillance en temps réel ont été largement utilisés dans divers domaines. L'une des technologies clés pour réaliser une surveillance en temps réel est la combinaison de WebSocket et de JavaScript. Cet article présentera l'application de WebSocket et JavaScript dans les systèmes de surveillance en temps réel, donnera des exemples de code et expliquera leurs principes de mise en œuvre en détail. 1. Technologie WebSocket

Comment utiliser JavaScript et WebSocket pour mettre en œuvre un système de commande en ligne en temps réel Comment utiliser JavaScript et WebSocket pour mettre en œuvre un système de commande en ligne en temps réel Dec 17, 2023 pm 12:09 PM

Introduction à l'utilisation de JavaScript et de WebSocket pour mettre en œuvre un système de commande en ligne en temps réel : avec la popularité d'Internet et les progrès de la technologie, de plus en plus de restaurants ont commencé à proposer des services de commande en ligne. Afin de mettre en œuvre un système de commande en ligne en temps réel, nous pouvons utiliser les technologies JavaScript et WebSocket. WebSocket est un protocole de communication full-duplex basé sur le protocole TCP, qui peut réaliser une communication bidirectionnelle en temps réel entre le client et le serveur. Dans le système de commande en ligne en temps réel, lorsque l'utilisateur sélectionne des plats et passe une commande

Comment mettre en œuvre un système de réservation en ligne à l'aide de WebSocket et JavaScript Comment mettre en œuvre un système de réservation en ligne à l'aide de WebSocket et JavaScript Dec 17, 2023 am 09:39 AM

Comment utiliser WebSocket et JavaScript pour mettre en œuvre un système de réservation en ligne. À l'ère numérique d'aujourd'hui, de plus en plus d'entreprises et de services doivent fournir des fonctions de réservation en ligne. Il est crucial de mettre en place un système de réservation en ligne efficace et en temps réel. Cet article explique comment utiliser WebSocket et JavaScript pour implémenter un système de réservation en ligne et fournit des exemples de code spécifiques. 1. Qu'est-ce que WebSocket ? WebSocket est une méthode full-duplex sur une seule connexion TCP.

JavaScript et WebSocket : créer un système efficace de prévisions météorologiques en temps réel JavaScript et WebSocket : créer un système efficace de prévisions météorologiques en temps réel Dec 17, 2023 pm 05:13 PM

JavaScript et WebSocket : Construire un système efficace de prévisions météorologiques en temps réel Introduction : Aujourd'hui, la précision des prévisions météorologiques revêt une grande importance pour la vie quotidienne et la prise de décision. À mesure que la technologie évolue, nous pouvons fournir des prévisions météorologiques plus précises et plus fiables en obtenant des données météorologiques en temps réel. Dans cet article, nous apprendrons comment utiliser la technologie JavaScript et WebSocket pour créer un système efficace de prévisions météorologiques en temps réel. Cet article démontrera le processus de mise en œuvre à travers des exemples de code spécifiques. Nous

Tutoriel JavaScript simple : Comment obtenir le code d'état HTTP Tutoriel JavaScript simple : Comment obtenir le code d'état HTTP Jan 05, 2024 pm 06:08 PM

Tutoriel JavaScript : Comment obtenir le code d'état HTTP, des exemples de code spécifiques sont requis Préface : Dans le développement Web, l'interaction des données avec le serveur est souvent impliquée. Lors de la communication avec le serveur, nous devons souvent obtenir le code d'état HTTP renvoyé pour déterminer si l'opération a réussi et effectuer le traitement correspondant en fonction de différents codes d'état. Cet article vous apprendra comment utiliser JavaScript pour obtenir des codes d'état HTTP et fournira quelques exemples de codes pratiques. Utilisation de XMLHttpRequest

Comment utiliser insertBefore en javascript Comment utiliser insertBefore en javascript Nov 24, 2023 am 11:56 AM

Utilisation : En JavaScript, la méthode insertBefore() est utilisée pour insérer un nouveau nœud dans l'arborescence DOM. Cette méthode nécessite deux paramètres : le nouveau nœud à insérer et le nœud de référence (c'est-à-dire le nœud où le nouveau nœud sera inséré).

JavaScript et WebSocket : créer un système de traitement d'images en temps réel efficace JavaScript et WebSocket : créer un système de traitement d'images en temps réel efficace Dec 17, 2023 am 08:41 AM

JavaScript est un langage de programmation largement utilisé dans le développement Web, tandis que WebSocket est un protocole réseau utilisé pour la communication en temps réel. En combinant les puissantes fonctions des deux, nous pouvons créer un système efficace de traitement d’images en temps réel. Cet article présentera comment implémenter ce système à l'aide de JavaScript et WebSocket, et fournira des exemples de code spécifiques. Tout d’abord, nous devons clarifier les exigences et les objectifs du système de traitement d’images en temps réel. Supposons que nous disposions d'un appareil photo capable de collecter des données d'image en temps réel.

See all articles