


Detailed explanation of function binding and class event binding functions in JavaScript in ES6
This article mainly introduces the JavaScript implementation of function binding and class event binding in ES6, and analyzes the principles, implementation methods, related operating techniques and precautions of function binding and class event binding in ES6 in the form of examples. Friends in need can refer to it, I hope it can help everyone.
Function Binding
Arrow functions can bind this object, which greatly reduces the number of ways to explicitly bind this object (call, apply, bind). However, arrow functions are not suitable for all situations, so ES7 proposes the "function bind" operator to replace call, apply, and bind calls. Although this syntax is still an ES7 proposal, the Babel transcoder already supports it.
The function binding operator is two double colons ( :: ) side by side. The left side of the double colon is an object and the right side is a function. This operator will automatically bind the object on the left as the context (i.e. this object) to the function on the right.
foo::bar; // 等同于 bar.bind(foo); foo::bar(...arguments); // 等同于 bar.apply(foo, arguments); const hasOwnProperty = Object.prototype.hasOwnProperty; function hasOwn(obj, key) { return obj::hasOwnProperty(key); }
If the left side of the double colon is empty and the right side is a method of an object, it is equivalent to binding the method to the object.
var method = obj::obj.foo; // 等同于 var method = ::obj.foo; let log = ::console.log; // 等同于 var log = console.log.bind(console);
Since the double colon operator still returns the original object, chain writing can be used.
// 例一 import { map, takeWhile, forEach } from "iterlib"; getPlayers() ::map(x => x.character()) ::takeWhile(x => x.strength > 100) ::forEach(x => console.log(x)); // 例二 let { find, html } = jake; document.querySelectorAll("p.myClass") ::find("p") ::html("hahaha");
Event binding in classes
Overview
ES6 provides classes, which brings great help to modularization. Binding events in a class is, firstly, to make the code structure clear, and secondly, so that the variables and methods of the class can be used. However, since the event callback function is not triggered by the instance object of the class, the this variable of the class cannot be accessed in the event callback function. In addition, we do not want the event callback function to be exposed to the outside world so that the caller cannot call it directly.
To put it simply, we hope:
1. The event callback function must be able to access the this variable of the class
2. The event callback function cannot be called directly
How Access the this of the class
Option 1: Save the this of the class as a local variable
The reference of this changes dynamically, but the reference of the local variable is clear, and, Local variables defined by a function are available throughout the function. So, we can use let that = this to save the this variable of the class.
class A{ //绑定事件的方法 bindEvent(){ let that = this; this.button1.on('click',function(e){ this.addClass('on'); //this指代所点的元素 that.doSomething(); //that指向类的this }) } doSomething(){ //事件处理函数 } //解绑事件 unBindEvent(){ this.button1.off(); } }
This method is only useful when using jquery, because the jquery unbinding event does not need to provide a callback function, just off directly. But there is a reason why native js needs to provide callback functions, because the same event of the same element can be bound to multiple callback functions, so you need to indicate which one to release.
Option 2: Use bind() to change the point of this
There is class A. In A, you need to add the mousemove event. Write the following code according to the requirements:
class A{ //添加事件 addEvent(){ document.addEventListener( 'mousemove', onMouseMove, false ); } //添加事件 removeEvent(){ document.removeEventListener( 'mousemove', onMouseMove , false ); } } //事件回调函数中 function onMouseMove(event){ console.log(this); //#document }
But , so you cannot get this of the class. onMouseMove's this will point to document. Because the event is added to the document, the event is naturally triggered by the document and onMouseMove is called for processing, so this in onMouseMove points to the document.
The more correct approach is to use the bind() function to change the pointer of this in onMouseMove, and at the same time move the event callback function outside the class:
class A{ //添加事件 addEvent(){ document.addEventListener( 'mousemove', onMouseMove.bind(this), false ); } //添加事件 removeEvent(){ document.removeEventListener( 'mousemove', onMouseMove.bind(this) , false ); } } //事件回调函数中 function onMouseMove(event){ console.log(this); }
But this still has problems, the event is removed No more falling! Because this.bind() returns a new function every time it is called, the second parameter of
document.addEventListener( 'mousemove', onMouseMove.bind(this), false );
and
document.removeEventListener( 'mousemove', onMouseMove.bind(this), false );
is not the same.
The correct approach is: Save the result of bind() in a variable:
class A{ constructor(){ this._onMouseMove = onMouseMove.bind(this); //看这里 } //添加事件 addEvent(){ document.addEventListener( 'mousemove', this._onMouseMove , false ); } //添加事件 removeEvent(){ document.removeEventListener( 'mousemove', this._onMouseMove , false ); } } //事件回调函数中 function onMouseMove(event){ console.log(this); }
How to define a private event callback function
In Java, you don’t want to expose it to the outside world The method can be defined as a private method, but ES6 does not provide private methods and can only be simulated through some methods. However, the event callback function is special because the event must be removed in addition to being defined, which will cause additional trouble. But there is still a way:
Use Symbol variables to define
const _onMouseMove = Symbol("_onMouseMove"); class A{ constructor(){ this[_onMouseMove] = onMouseMove.bind(this); } //添加事件 addEvent(){ document.addEventListener( 'mousemove', this[_onMouseMove] , false ); } //添加事件 removeEvent(){ document.removeEventListener( 'mousemove', this[_onMouseMove] , false ); } } //事件回调函数中 function onMouseMove(event){ console.log(this); }
Symbol("_onMouseMove") will produce a unique value, which is generated when the object is created, so , the caller has no way to know this value when writing code, so it cannot call the method named with this value, thus defining a private method.
Related recommendations:
Examples to explain the usage of JavaScript function binding
Detailed explanation of how to use function binding code for JavaScript interaction
The above is the detailed content of Detailed explanation of function binding and class event binding functions in JavaScript in ES6. For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics

WebSocket and JavaScript: Key technologies for realizing real-time monitoring systems Introduction: With the rapid development of Internet technology, real-time monitoring systems have been widely used in various fields. One of the key technologies to achieve real-time monitoring is the combination of WebSocket and JavaScript. This article will introduce the application of WebSocket and JavaScript in real-time monitoring systems, give code examples, and explain their implementation principles in detail. 1. WebSocket technology

Understand the meaning of HTTP 301 status code: common application scenarios of web page redirection. With the rapid development of the Internet, people's requirements for web page interaction are becoming higher and higher. In the field of web design, web page redirection is a common and important technology, implemented through the HTTP 301 status code. This article will explore the meaning of HTTP 301 status code and common application scenarios in web page redirection. HTTP301 status code refers to permanent redirect (PermanentRedirect). When the server receives the client's

HTTP Status Code 200: Explore the Meaning and Purpose of Successful Responses HTTP status codes are numeric codes used to indicate the status of a server's response. Among them, status code 200 indicates that the request has been successfully processed by the server. This article will explore the specific meaning and use of HTTP status code 200. First, let us understand the classification of HTTP status codes. Status codes are divided into five categories, namely 1xx, 2xx, 3xx, 4xx and 5xx. Among them, 2xx indicates a successful response. And 200 is the most common status code in 2xx

JavaScript tutorial: How to get HTTP status code, specific code examples are required. Preface: In web development, data interaction with the server is often involved. When communicating with the server, we often need to obtain the returned HTTP status code to determine whether the operation is successful, and perform corresponding processing based on different status codes. This article will teach you how to use JavaScript to obtain HTTP status codes and provide some practical code examples. Using XMLHttpRequest

How to implement HTTP streaming in C++? Create an SSL stream socket using Boost.Asio and the asiohttps client library. Connect to the server and send an HTTP request. Receive HTTP response headers and print them. Receives the HTTP response body and prints it.

The HTTP request times out, and the server often returns the 504GatewayTimeout status code. This status code indicates that when the server executes a request, it still fails to obtain the resources required for the request or complete the processing of the request after a period of time. It is a status code of the 5xx series, which indicates that the server has encountered a temporary problem or overload, resulting in the inability to correctly handle the client's request. In the HTTP protocol, various status codes have specific meanings and uses, and the 504 status code is used to indicate request timeout issues. in customer

Introduction to the method of obtaining HTTP status code in JavaScript: In front-end development, we often need to deal with the interaction with the back-end interface, and HTTP status code is a very important part of it. Understanding and obtaining HTTP status codes helps us better handle the data returned by the interface. This article will introduce how to use JavaScript to obtain HTTP status codes and provide specific code examples. 1. What is HTTP status code? HTTP status code means that when the browser initiates a request to the server, the service

Solution: 1. Retry: You can wait for a period of time and try again, or refresh the page; 2. Check the server load: Check the server's CPU, memory and disk usage. If the capacity limit is exceeded, you can try to optimize the server configuration or increase the capacity. Server resources; 3. Check server maintenance and upgrades: You can only wait until the server returns to normal; 4. Check network connection: Make sure the network connection is stable, check whether the network device, firewall or proxy settings are correct; 5. Ensure cache or CDN configuration Correct; 6. Contact the server administrator, etc.
