search
HomeWeb Front-endCSS TutorialDetailed explanation of this in JavaScript

Detailed explanation of this in JavaScript

Nov 28, 2016 pm 01:59 PM
javascript

This in JavaScript is always confusing and should be one of the well-known pitfalls of js. Personally, I also think that this in js is not a good design. Due to the late binding feature of this, it can be the global object, the current object, or... some people even do not use this because of the big pitfalls.


In fact, if you fully grasp the working principle of this, you will naturally not fall into these pits. Let’s take a look at what this will point to in the following situations:

1. this in the global code
1 alert(x);
// The value of global variable x is 2


this in the global scope will Will point to the global object, which is window in the browser.

2. Call as a simple function
function fooCoder(x) {
this.x = x;
}
fooCoder(2);
alert(x);
// The value of global variable x is 2


Here this points to the global object, which is window. In strict mode, it is undefined.

3. Call as method of object
var name = "clever coder";
var person = {
name : "foocoder",
hello : function(sth){
console.log(this.name + " says " + sth);
}
}
person.hello("hello world");

output foocoder says hello world. this points to the person object, which is the current object.

4. As a constructor

1 new FooCoder();

this inside the function points to the newly created object.


5. Internal function
var name = "clever coder";

var person = {
name : "foocoder",
hello : function(sth){
var sayhello = function(sth) {
console.log (this.name + " says " + sth);
};
sayhello(
}

person.hello("hello world");
//clever coder says hello world


In the inner function, This is not bound to the outer function object as expected, but to the global object. This is generally considered a design error in the JavaScript language, because no one wants this in the inner function to point to the global object. The way is to save this as a variable, generally agreed as that or self:
var name = "clever coder";
var person = {
name : "foocoder",
hello : function(sth){
var that = this ;
var sayhello = function(sth) {
console.log(that.name + " says " + sth);
};
sayhello(sth);
}
}
person.hello("hello world");
//foocoder says hello world


6. Use call and apply to set this

1 person.hello.call(person, "world");

apply is similar to call, except that the following parameters are passed through a The array is passed in instead of separately. The method definitions of the two are:

call(thisArg [, arg1, arg2,...]);
//Parameter list, arg1, arg2,...


apply(thisArg [, argArray] );
// Parameter array, argArray


Both are used to bind a function to a specific object. Naturally, this will be explicitly set to the first Parameters.

A brief summary

To simply summarize the above points, we can find that only the sixth point is confusing.

In fact, it can be summarized as the following points:

When a function is used as an object method. When called, this points to the object.
When the function is called as a fadeout function, this points to the global object (undefined in strict mode)
This in the constructor points to the newly created object
This in nested functions is not inherited The this of the upper-level function, if necessary, can be used to save the this of the upper-level function in a variable.


To summarize simply, if this is used in a function, this will point to the object only when the function is directly called by an object.
obj.foocoder();
foocoder.call(obj, ...);
foocoder.apply(obj, ...);

Go further

We may often write code like this:

1 $ ("#some-ele").click = obj.handler;

If this is used in handler, will this be bound to obj? Obviously not. After the assignment, the function is executed in the callback, and this will be bound to the $("#some-div") element. This requires understanding the execution environment of the function. This article does not intend to go into detail about the execution environment of the function. You can refer to the relevant introduction to the execution environment and scope chain in "Javascript Advanced Programming". What I want to point out here is that understanding the execution environment of the js function will help you better understand this.


So how can we solve the problem of callback function binding? A new method was introduced in ES5, bind():
fun.bind(thisArg[, arg1[, arg2[, ...]]])

thisArg

When the binding function is called, the The parameter will be used as the this point of the original function when running. When the new operator is used to call the bound function, the parameter is invalid.

1 arg1, arg2, ...

When the bound function is called, these parameters are added The parameters of the bound function itself will be used as the parameters of the original function when running in order.


This method creates a new function, called a binding function. The binding function will use the first parameter passed into the bind method when creating it as this, and the second and subsequent parameters passed into the bind method plus the binding When the function is running, the parameters of the function itself are used as parameters of the original function in order to call the original function.

Obviously the bind method can solve the above problem well.
1
2 $("#some-ele").click(person.hello.bind(person));
//When the corresponding element is clicked, the output foocoder says hello world


In fact, this method is also very simple Easy to simulate, let’s take a look at the source code of the bind method in Prototype.js:
Function.prototype.bind = function(){
var fn = this, args = Array.prototype.slice.call(arguments), object = args.shift ();
return function(){
return fn.apply(object,
args.concat(Array.prototype.slice.call(arguments)));
};
};


Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Using Pages CMS for Static Site Content ManagementUsing Pages CMS for Static Site Content ManagementMay 13, 2025 am 09:24 AM

I know, I know: there are a ton of content management system options available, and while I've tested several, none have really been the one, y'know? Weird pricing models, difficult customization, some even end up becoming a whole &

The Ultimate Guide to Linking CSS Files in HTMLThe Ultimate Guide to Linking CSS Files in HTMLMay 13, 2025 am 12:02 AM

Linking CSS files to HTML can be achieved by using elements in part of HTML. 1) Use tags to link local CSS files. 2) Multiple CSS files can be implemented by adding multiple tags. 3) External CSS files use absolute URL links, such as. 4) Ensure the correct use of file paths and CSS file loading order, and optimize performance can use CSS preprocessor to merge files.

CSS Flexbox vs Grid: a comprehensive reviewCSS Flexbox vs Grid: a comprehensive reviewMay 12, 2025 am 12:01 AM

Choosing Flexbox or Grid depends on the layout requirements: 1) Flexbox is suitable for one-dimensional layouts, such as navigation bar; 2) Grid is suitable for two-dimensional layouts, such as magazine layouts. The two can be used in the project to improve the layout effect.

How to Include CSS Files: Methods and Best PracticesHow to Include CSS Files: Methods and Best PracticesMay 11, 2025 am 12:02 AM

The best way to include CSS files is to use tags to introduce external CSS files in the HTML part. 1. Use tags to introduce external CSS files, such as. 2. For small adjustments, inline CSS can be used, but should be used with caution. 3. Large projects can use CSS preprocessors such as Sass or Less to import other CSS files through @import. 4. For performance, CSS files should be merged and CDN should be used, and compressed using tools such as CSSNano.

Flexbox vs Grid: should I learn them both?Flexbox vs Grid: should I learn them both?May 10, 2025 am 12:01 AM

Yes,youshouldlearnbothFlexboxandGrid.1)Flexboxisidealforone-dimensional,flexiblelayoutslikenavigationmenus.2)Gridexcelsintwo-dimensional,complexdesignssuchasmagazinelayouts.3)Combiningbothenhanceslayoutflexibilityandresponsiveness,allowingforstructur

Orbital Mechanics (or How I Optimized a CSS Keyframes Animation)Orbital Mechanics (or How I Optimized a CSS Keyframes Animation)May 09, 2025 am 09:57 AM

What does it look like to refactor your own code? John Rhea picks apart an old CSS animation he wrote and walks through the thought process of optimizing it.

CSS Animations: Is it hard to create them?CSS Animations: Is it hard to create them?May 09, 2025 am 12:03 AM

CSSanimationsarenotinherentlyhardbutrequirepracticeandunderstandingofCSSpropertiesandtimingfunctions.1)Startwithsimpleanimationslikescalingabuttononhoverusingkeyframes.2)Useeasingfunctionslikecubic-bezierfornaturaleffects,suchasabounceanimation.3)For

@keyframes CSS: The most used tricks@keyframes CSS: The most used tricksMay 08, 2025 am 12:13 AM

@keyframesispopularduetoitsversatilityandpowerincreatingsmoothCSSanimations.Keytricksinclude:1)Definingsmoothtransitionsbetweenstates,2)Animatingmultiplepropertiessimultaneously,3)Usingvendorprefixesforbrowsercompatibility,4)CombiningwithJavaScriptfo

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

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

Hot Article

Hot Tools

MantisBT

MantisBT

Mantis is an easy-to-deploy web-based defect tracking tool designed to aid in product defect tracking. It requires PHP, MySQL and a web server. Check out our demo and hosting services.

EditPlus Chinese cracked version

EditPlus Chinese cracked version

Small size, syntax highlighting, does not support code prompt function

VSCode Windows 64-bit Download

VSCode Windows 64-bit Download

A free and powerful IDE editor launched by Microsoft

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

Powerful PHP integrated development environment

PhpStorm Mac version

PhpStorm Mac version

The latest (2018.2.1) professional PHP integrated development tool