This article mainly introduces the analysis of function declarations and function expressions of js. It has certain reference value. Now I share it with you. Friends in need can refer to it
In JavaScript we have the following two ways to define functions:
Function declaration
function say(){ console.log('函数声明'); }
Function expression
var say = function(){ console.log('函数表达式'); }
In normal development, they have imperceptible differences. Let’s take a look at the following example:
say(); var say = function(){ console.log('函数表达式'); } say(); function say(){ console.log('函数声明'); } say();
You can first think about the answer in your mind and execute the result It is:
函数声明 函数表达式 函数表达式
Come, let’s analyze this result:
1. When the say function is called for the first time, the function has not been defined yet, so why can the value of "function declaration" be printed out? Woolen cloth? The reason is that there is a mechanism in the
javascript interpreter whereby variable declarations are promoted, which means that function declarations will be promoted to the front of the scope, even if the code is written Even those at the back will still be promoted to the front.
The function created with a function expression is assigned at runtime, and cannot be called until the expression assignment is completed.
Therefore, even if the function has not been defined, the function declaration has been promoted to At the front, the above code is equivalent to:
var say; //变量被提升,此时的值为undefined say();// 函数被提升,输出“函数声明” var say = function(){ console.log('函数表达式'); } say(); function say(){ console.log('函数声明'); } say();
From the comparison of the following two, we can better understand the concept of "function declaration promotion":
1.
var say; console.log(say); say(); function say(){ console.log('函数声明'); } 输出: f say(){ console.log('函数声明'); } 函数声明
2.
var say; console.log(say); say(); var say = function(){ console.log('函数表达式'); } 输出: undefined Uncaught TypeError: say is not a function at <anonymous>:3:1
2. When the say function is called for the second time, we can simply understand that the function expression
at this time covers the function declaration
, so ' Function expression', but when the say function is called for the third time, what is printed is still 'function expression'? ? Why does the following function declaration
not cover the previous function expression
? In fact, due to the promotion of function declarations at runtime, the actual running order is similar to this:
function say() { console.log('函数声明'); }//因为函数声明提升,所以在最前面运行了 say(); var say = function() { console.log('函数表达式'); } say(); say();
1. Function declaration` is promoted during JS parsing , so within the same scope, the function can be called regardless of where the function declaration is defined.
2. The value of the function expression is determined when JS is running, and the function can be called only after the expression assignment is completed
The above is the entire content of this article, I hope it will be helpful to everyone's learning , please pay attention to the PHP Chinese website for more related content!
Related recommendations:
How to convert a pseudo array into an array through JS
How to use JS to find the array difference method
The above is the detailed content of Analysis of js function declaration and function expression. For more information, please follow other related articles on the PHP Chinese website!