Analyzing questions about JavaScript scope
Everyone who has written a program will be familiar with the concept of scope. In this article, let’s talk about the scope of Javascript.
In Javascript, the global environment itself is an object. In the browser host, this object is window, but when Javascript is used in other non-browser hosts, such as embedded environments, it may be other objects.
I would also like to correct a concept here. Many people think that Javascript is only used in browsers. In fact, Javascript can also be used in many non-Web situations. According to reports, Javascript performs well in some embedded-based application fields. It's also very good. Of course, I've only heard these legends.
Closer to home, when we write: var i=1, we are actually declaring a variable in the window scope.
When we write i=1, we declare a window attribute.
看这样一段代码: [code=javascript"> <script type="text/javascript"> var a = "hello"; b = "world"; Test(); function Test() { alert(a + " " + b); var a = "welcome"; b = "china"; alert(a + " " + b); } alert(a + " " + b); </script> function runCode(id) { obj = document.getElementById(id); var TestWin=open(''); //打开一个窗口并赋给变量TestWin。 TestWin.opener = null // 防止代码对论谈页面修改 TestWin.document.write(obj.value); //向这个打开的窗口中写入代码code,这样就实现了运行代码功能。 TestWin.document.close(); } var a = "hello"; b = "world"; Test(); function Test() { alert(a + " " + b); var a = "welcome"; b = "china"; alert(a + " " + b); } alert(a + " " + b);
The output results of this code are: undefined world, welcome china, hello china.
Let’s explain them separately:
Above In the article, we said that when Javascript is pre-compiled, all var variables will be created, and the default value is undefined. We can give an example here:
We can write a piece of code like this:
<script type="text/javascript"> alert(a); alert(b); var a = "111"; b = "111"; </script> [/code] alert(a); alert(b); var a = "111"; b = "111";
When we execute this script, we can find that undefined pops up first, and then a script error is prompted, indicating that b does not exist. It can be shown that a has been created and initialized to undefined during the precompilation process, but b can only be interpreted sequentially during actual runtime. In fact, the precompiled Javascript code can be almost understood as follows:
<script type="text/javascript"> var a = undefined; alert(a); alert(b); a = "111"; b = "111"; </script>
Next we can talk about the scope of the function. Whenever the code runs into a function, the Javascript engine A new scope will be automatically created, then this new scope will be used as a child scope of the current scope, and then the current code scope will be switched to this new scope. When the code exits the function, this scope is destroyed, returning the code scope to its parent scope.
Okay, the preparations are almost done. Next we will explain the first question: asking why undefined world will be output.
First, the code is precompiled. When entering the Test method, a new scope is opened, and then the global scope is used as its parent scope. Then precompile the method in Test. Like the above code, the method body after the Test method is precompiled is roughly as follows:
function Test() { var a = undefined; alert(a + " " + b); var a = "welcome"; b = "china"; alert(a + " " + b); }
Of course, b cannot be found in the current scope , so he will go to his parent scope, that is, the global scope and find b="world". So this result was produced.
Welcome china pops up for the second time, there is nothing to say.
The third time, hello china pops up. We can understand that var a is just a local variable of method Test, and since b is not declared in advance, it will go to the parent scope to find the corresponding definition.
Okay, next, let’s look at several variations of this method.
<script type="text/javascript"> var a = "hello"; b = "world"; Test(); function Test() { alert(a + " " + b); a = "welcome"; b = "china"; alert(a + " " + b); } alert(a + " " + b); </script>
First, we change the var a in the method body to a. Let’s analyze it directly without looking at the answer. First of all, in the pre-compilation stage, there is almost no change in the method body. Therefore, at this time, a and b have to go to their parent scope to find it, so the first time the result should be hello world, the second time there is nothing to say: welcome china, and the third time because a and b are in There is no pre-definition in this scope, so the value in the parent scope is changed, so welcome china.
Let’s continue:
<script type="text/javascript"> var a = "hello"; b = "world"; Test(); function Test() { alert(a + " " + b); var a = "welcome"; var b = "china"; alert(a + " " + b); } alert(a + " " + b); </script>
Same as the above analysis, It should output undefined undefined, welcome china, hello world.
<script type="text/javascript"> a = "hello"; b = "world"; Test(); function Test() { alert(a + " " + b); var a = "welcome"; b = "china"; alert(a + " " + b); } alert(a + " " + b); </script>
It should output undefined china, welcome china, hello china.
After testing, there is no problem.
Therefore, we can conclude that when each variable cannot find its own definition, it will search upward along the chain of action, which is likely to cause unexpected errors, adding a lot of difficulties to troubleshooting. . What's more troublesome is that the variable value on the parent scope may also be modified, so we should try to add var when declaring the variable, although Javascript does not force us to do so.
The above is the detailed content of Analyzing questions about JavaScript scope. 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



typedef struct is used in C language to create structure type aliases to simplify the use of structures. It aliases a new data type to an existing structure by specifying the structure alias. Benefits include enhanced readability, code reuse, and type checking. Note: The structure must be defined before using an alias. The alias must be unique in the program and only valid within the scope in which it is declared.

Variable expected value exceptions in Java can be solved by: initializing variables; using default values; using null values; using checks and assignments; and knowing the scope of local variables.

Advantages of JavaScript closures include maintaining variable scope, enabling modular code, deferred execution, and event handling; disadvantages include memory leaks, increased complexity, performance overhead, and scope chain effects.

The #include preprocessor directive in C++ inserts the contents of an external source file into the current source file, copying its contents to the corresponding location in the current source file. Mainly used to include header files that contain declarations needed in the code, such as #include <iostream> to include standard input/output functions.

Life cycle of C++ smart pointers: Creation: Smart pointers are created when memory is allocated. Ownership transfer: Transfer ownership through a move operation. Release: Memory is released when a smart pointer goes out of scope or is explicitly released. Object destruction: When the pointed object is destroyed, the smart pointer becomes an invalid pointer.

Can. C++ allows nested function definitions and calls. External functions can define built-in functions, and internal functions can be called directly within the scope. Nested functions enhance encapsulation, reusability, and scope control. However, internal functions cannot directly access local variables of external functions, and the return value type must be consistent with the external function declaration. Internal functions cannot be self-recursive.

In Vue, there is a difference in scope when declaring variables between let and var: Scope: var has global scope and let has block-level scope. Block-level scope: var does not create a block-level scope, let creates a block-level scope. Redeclaration: var allows redeclaration of variables in the same scope, let does not.

In JavaScript, the pointing types of this include: 1. Global object; 2. Function call; 3. Constructor call; 4. Event handler; 5. Arrow function (inheriting outer this). Additionally, you can explicitly set what this points to using the bind(), call(), and apply() methods.
