Home Web Front-end JS Tutorial Analyzing questions about JavaScript scope

Analyzing questions about JavaScript scope

May 07, 2017 am 11:46 AM
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(&#39;&#39;); //打开一个窗口并赋给变量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);
Copy after login

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";
Copy after login

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>
Copy after login

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);
}
Copy after login


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>
Copy after login

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>
Copy after login

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>
Copy after login

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!

Statement of this Website
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

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 Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Usage of typedef struct in c language Usage of typedef struct in c language May 09, 2024 am 10:15 AM

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.

How to solve variable expected in java How to solve variable expected in java May 07, 2024 am 02:48 AM

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 and disadvantages of closures in js Advantages and disadvantages of closures in js May 10, 2024 am 04:39 AM

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.

What does include mean in c++ What does include mean in c++ May 09, 2024 am 01:45 AM

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.

C++ smart pointers: a comprehensive analysis of their life cycle C++ smart pointers: a comprehensive analysis of their life cycle May 09, 2024 am 11:06 AM

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 the definition and call of functions in C++ be nested? Can the definition and call of functions in C++ be nested? May 06, 2024 pm 06:36 PM

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.

The difference between let and var in vue The difference between let and var in vue May 08, 2024 pm 04:21 PM

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.

There are several situations where this in js points to There are several situations where this in js points to May 06, 2024 pm 02:03 PM

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.

See all articles