Function context scope doubt
Hi everybody,
Hope you all are doing great.
I have a question regarding how object's context works on functions at Node.JS.
For example:
function nestedFunctions() {
var a = "I am a variable"
console.log("Initial context:")
console.log(this)
function one() {
console.log("First nested function, this is my this context:")
console.log(this)
console.log("First nested function, this is my a value:")
console.log(a)
function two() {
console.log("Second nested function, this is my this context:")
console.log(this)
console.log("Second nested function, this is my a value:")
console.log(a)
}
two()
}
one()
}
nestedFunctions()
The output of that code is:
Initial context: Object Global First nested function, this is my this context: Object Global First nested function, this is my a value: I am a variable Second nested function, this is my this context: Object Global Second nested function, this is my a value: I am a variable
Everything OK so far, because the function context (this) is created on global scope, and so the nested functions. But my doubt is when running the following code:
class Dog {
constructor(name) {
this.name = name
}
bark() {
console.log(`Woof, my name is ${this.name}`);
}
nestedFunctions() {
var a = "I am a variable"
console.log("Initial context:")
console.log(this)
function one() {
console.log("First nested function, this is my this context:")
console.log(this)
console.log("First nested function, this is my a value:")
console.log(a)
function two() {
console.log("Second nested function, this is my this context:")
console.log(this)
console.log("Second nested function, this is my a value:")
console.log(a)
}
two()
}
one()
}
}
let rex = new Dog('Rex')
//rex.sitAndBark()
rex.nestedFunctions()
Output:
Initial context:
Dog { name: 'Rex' }
First nested function, this is my this context:
undefined
First nested function, this is my a value:
I am a variable
Second nested function, this is my this context:
undefined
Second nested function, this is my a value:
I am a variable
I am having troubles understanding that last one, and why the this of the nested functions is undefined. Why isn't the global context instead of undefined (like when declared outside a class, i.e, the first example)?
Best regards to all
Comments
-
Another example with the function defined on an object:
var rex = { nestedFunctions() { var a = "I am a variable" console.log("Initial context:") console.log(this) function one() { console.log("First nested function, this is my this context:") console.log(this) console.log("First nested function, this is my a value:") console.log(a) function two() { console.log("Second nested function, this is my this context:") console.log(this) console.log("Second nested function, this is my a value:") console.log(a) } two() } one() } } rex.nestedFunctions()The output in that case is:
Initial context: { nestedFunctions: [Function: nestedFunctions] } First nested function, this is my this context: Object Global First nested function, this is my a value: I am a variable Second nested function, this is my this context: Object Global Second nested function, this is my a value: I am a variableWhich is the same behaviour of the first example. I don't get why in the second case, the one on a class definition, the result of the nested "this" is undefined instead of the global context.
0 -
Got the answer:
That's because the body of a JavaScript class executes in strict mode. This mode, as its name suggests, is a bit more restrictive. Among the features of this execution mode, this doesn't refer to window inside a function that is being called as a bare function, it returns undefined instead.Object's context ('this') between nested functions at a class
0 -
@IgnacioAcuna Exactly correct
0
Categories
- All Categories
- 178 LFX Mentorship
- 178 LFX Mentorship: Linux Kernel
- 775 Linux Foundation IT Professional Programs
- 384 Cloud Engineer IT Professional Program
- 175 Advanced Cloud Engineer IT Professional Program
- 75 DevOps IT Professional Program - Discontinued
- 7 DevOps & GitOps IT Professional Program
- 103 Cloud Native Developer IT Professional Program
- 7.7K Training Courses & Learning Paths
- 13 AI & ML Training
- 1 Blockchain & Decentralized Identity Training
- 35 Cloud & Containers Training
- 3 Cybersecurity Training
- 3 DevOps & Site-Reliability Training
- 2 Linux Kernel Development Training
- 2 Networking Training
- 2 Open Source Best Practice Training
- 5 System Administration Training
- 1 System Engineering Training
- 6 Web & Application Development Training
- 798 Hardware
- 202 Drivers
- 68 I/O Devices
- 37 Monitors
- 96 Multimedia
- 173 Networking
- 91 Printers & Scanners
- 92 Storage
- 773 Linux Distributions
- 81 Debian
- 68 Fedora
- 24 Linux Mint
- 13 Mageia
- 24 openSUSE
- 151 Red Hat Enterprise
- 32 Slackware
- 13 SUSE Enterprise
- 356 Ubuntu
- 472 Linux System Administration
- 31 Cloud Computing
- 73 Command Line/Scripting
- Github systems admin projects
- 103 Linux Security
- 79 Network Management
- 102 System Management
- 46 Web Management
- 166 Mobile Computing
- 32 Android
- 119 Development
- 1.2K New to Linux
- 1K Getting Started with Linux
- 407 Off Topic
- 128 Introductions
- 35 Study Material
- 1.1K Programming and Development
- 311 Kernel Development
- 723 Software Development
- 1K Software
- 418 Applications
- 183 Command Line
- 5 Compiling/Installing
- 71 Games
- 320 Installation
- Archived
- 183 Small Talk
- 2 LFD140 Class Forum
- 1.4K LFS258 Class Forum
Upcoming Training
-
August 20, 2018
Kubernetes Administration (LFS458)
-
August 20, 2018
Linux System Administration (LFS301)
-
August 27, 2018
Open Source Virtualization (LFS462)
-
August 27, 2018
Linux Kernel Debugging and Security (LFD440)
