Home Web Front-end JS Tutorial Looking at JavaScript preloading from the definition of function

Looking at JavaScript preloading from the definition of function

Nov 28, 2016 pm 03:26 PM

There are two ways to define a function in JavaScript:

function ftn(){} // 第一种
var ftn = function(){} // 第二种
Copy after login

Some people say that these two ways of writing are completely equivalent. However, before parsing, the former way of writing will be automatically promoted to the head of the code by the parser, which violates the principle of defining functions first and then using them. Therefore, it is recommended to use the latter way of writing when defining functions.

After reading this sentence, my first feeling is that the two are completely the same when used, but there are differences in analysis. But his explanation that "the former way of writing will be automatically promoted to the head of the code by the parser" confused me.

So I had the following first test:

<script type="text/javascript">
function ftn()
{
    alert(&#39;old&#39;);
}
 
var b = ftn;
 
function ftn()
{
    b();
    alert(&#39;new&#39;);
}
 
ftn();//浏览器报内存溢出
</script>
Copy after login

Then I did the second test:

<script type="text/javascript">
var ftn = function()
{
    alert(&#39;old&#39;);
}
 
var b = ftn;
 
var ftn = function()
{
    b();
    alert(&#39;new&#39;);
}
 
ftn();//old,new依次弹出
</script>
Copy after login

The explanation on the Internet is: the first way, the Function of ftn was not redefined at the beginning. executed itself inside. The second way, ftn=function() here is not executed into the code in Function. ftn has been redefined, so the redefinition here is valid.

If it’s not clear, then I did another test as follows:

<script type="text/javascript">
function ftn()
{
    alert(&#39;old&#39;);
}
 
var b = ftn;
 
function ftn()
{
    b();
    alert(&#39;new&#39;);
}
 
alert(b);//结果是重新定义的ftn内容
</script>
Copy after login

The test results found that after redefining ftn, the content of b will also change. Next, I did two more tests:

<script type="text/javascript">
var ftn = function()
{
    alert(&#39;old&#39;);
}
 
var b = ftn;
 
var ftn = function()
{
    b();
    alert(&#39;new&#39;);
}
 
alert(b);//结果是老的ftn内容
</script>
Copy after login

This is very interesting. In JavaScript, except for basic data types, other types are objects. The object is stored in the heap, and its alias is the address stored in the stack. One test can obviously be understood using this principle. So why did the previous test b change with the redefinition of ftn?

I have a new explanation, I don’t know if it’s right or not. It will be mentioned in all JavaScript books that there is no method overloading in JavaScript. A function with the same name defined later will overwrite the previous function, var b = ftn; This sentence points the references of b and ftn to the memory in the same heap. After redefining function ftn(){}, the new function object overwrites the old object, but the heap address space referenced by b and ftn remains unchanged. , if this is the case, then this way of writing is reasonable:

<script type="text/javascript">
function ftn()
{
    alert(&#39;old&#39;);
}
 
var b = ftn;
 
var ftn = function()
{
    b();
    alert(&#39;new&#39;);
}
 
alert(b);//老的ftn
alert(ftn);//新的ftn
ftn();//old ,new
</script>
Copy after login

In this way, the address of the new ftn in the stack has changed, pointing to the definition of the new function object, and the original function has not been overwritten and is still saved, so b It is still the address referenced by the old ftn.

I just wrote an article about understanding the functions in JavaScript. When I look back and think about the content of my article, I feel that my understanding of the test results is still a bit problematic. In fact, understanding still needs to be based on the principles of compilation and operation. . JavaScript compiles the code when the code is executed, so the type defined by our var can be variable. The objects we encapsulate often add properties and methods, so we can understand the problems caused by my title in this way. The general language of javascript, such as definition A variable var obj = new Object() only performs a very initial process, which is called precompilation in JavaScript. This precompilation capability is very weak. It is so weak that you can change it at will without affecting the running of the program. When the object is called, the JavaScript interpreter will compile and then run the code. This is very different from Java. Java compiles the code first and then runs it when it is called. This is the characteristic of script languages, so most script languages Not fast. But when you define a function like this: fonction ftn(){}, the code is compiled, that is, executed. This writing method is very similar to the definition of a java function. This is my new interpretation, and I think this explanation is more reasonable.

The "compilation" of JavaScript only checks whether there are code errors and does not run the code. You can try writing anything in the function to test it. Preloading, function first, then var. In the above code, only demo1 and demo3 are affected. The source code order of demo1 and demo3 is function - var - function. The order after applying preloading is: function - function - var. The complete code after preloading:

<script type="text/javascript">
//demo1
function ftn()
{
    alert(&#39;old&#39;);
}
function ftn()
{
    b();
    alert(&#39;new&#39;);
}
var b = ftn;
 
ftn();//浏览器报内存溢出
</script>
Copy after login
<script type="text/javascript">
//demo3
function ftn()
{
  alert(&#39;old&#39;);
}
function ftn()
{
  b();
  alert(&#39;new&#39;);
}
var b = ftn;
 
alert(b);//结果是重新定义的ftn内容
</script>
Copy after login

preloading That's about it.

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)

Hot Topics

Java Tutorial
1659
14
PHP Tutorial
1258
29
C# Tutorial
1232
24
Demystifying JavaScript: What It Does and Why It Matters Demystifying JavaScript: What It Does and Why It Matters Apr 09, 2025 am 12:07 AM

JavaScript is the cornerstone of modern web development, and its main functions include event-driven programming, dynamic content generation and asynchronous programming. 1) Event-driven programming allows web pages to change dynamically according to user operations. 2) Dynamic content generation allows page content to be adjusted according to conditions. 3) Asynchronous programming ensures that the user interface is not blocked. JavaScript is widely used in web interaction, single-page application and server-side development, greatly improving the flexibility of user experience and cross-platform development.

The Evolution of JavaScript: Current Trends and Future Prospects The Evolution of JavaScript: Current Trends and Future Prospects Apr 10, 2025 am 09:33 AM

The latest trends in JavaScript include the rise of TypeScript, the popularity of modern frameworks and libraries, and the application of WebAssembly. Future prospects cover more powerful type systems, the development of server-side JavaScript, the expansion of artificial intelligence and machine learning, and the potential of IoT and edge computing.

JavaScript Engines: Comparing Implementations JavaScript Engines: Comparing Implementations Apr 13, 2025 am 12:05 AM

Different JavaScript engines have different effects when parsing and executing JavaScript code, because the implementation principles and optimization strategies of each engine differ. 1. Lexical analysis: convert source code into lexical unit. 2. Grammar analysis: Generate an abstract syntax tree. 3. Optimization and compilation: Generate machine code through the JIT compiler. 4. Execute: Run the machine code. V8 engine optimizes through instant compilation and hidden class, SpiderMonkey uses a type inference system, resulting in different performance performance on the same code.

JavaScript: Exploring the Versatility of a Web Language JavaScript: Exploring the Versatility of a Web Language Apr 11, 2025 am 12:01 AM

JavaScript is the core language of modern web development and is widely used for its diversity and flexibility. 1) Front-end development: build dynamic web pages and single-page applications through DOM operations and modern frameworks (such as React, Vue.js, Angular). 2) Server-side development: Node.js uses a non-blocking I/O model to handle high concurrency and real-time applications. 3) Mobile and desktop application development: cross-platform development is realized through ReactNative and Electron to improve development efficiency.

Python vs. JavaScript: The Learning Curve and Ease of Use Python vs. JavaScript: The Learning Curve and Ease of Use Apr 16, 2025 am 12:12 AM

Python is more suitable for beginners, with a smooth learning curve and concise syntax; JavaScript is suitable for front-end development, with a steep learning curve and flexible syntax. 1. Python syntax is intuitive and suitable for data science and back-end development. 2. JavaScript is flexible and widely used in front-end and server-side programming.

How to Build a Multi-Tenant SaaS Application with Next.js (Frontend Integration) How to Build a Multi-Tenant SaaS Application with Next.js (Frontend Integration) Apr 11, 2025 am 08:22 AM

This article demonstrates frontend integration with a backend secured by Permit, building a functional EdTech SaaS application using Next.js. The frontend fetches user permissions to control UI visibility and ensures API requests adhere to role-base

From C/C   to JavaScript: How It All Works From C/C to JavaScript: How It All Works Apr 14, 2025 am 12:05 AM

The shift from C/C to JavaScript requires adapting to dynamic typing, garbage collection and asynchronous programming. 1) C/C is a statically typed language that requires manual memory management, while JavaScript is dynamically typed and garbage collection is automatically processed. 2) C/C needs to be compiled into machine code, while JavaScript is an interpreted language. 3) JavaScript introduces concepts such as closures, prototype chains and Promise, which enhances flexibility and asynchronous programming capabilities.

Building a Multi-Tenant SaaS Application with Next.js (Backend Integration) Building a Multi-Tenant SaaS Application with Next.js (Backend Integration) Apr 11, 2025 am 08:23 AM

I built a functional multi-tenant SaaS application (an EdTech app) with your everyday tech tool and you can do the same. First, what’s a multi-tenant SaaS application? Multi-tenant SaaS applications let you serve multiple customers from a sing

See all articles