Home  >  Article  >  Web Front-end  >  Analysis of js function declaration and function expression

Analysis of js function declaration and function expression

不言
不言Original
2018-07-14 17:40:561651browse

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

1.Definition

In JavaScript we have the following two ways to define functions:

Function declaration

  function say(){
     console.log('函数声明');
  }

Function expression

   var say = function(){
      console.log('函数表达式');
   }

2. Example analysis

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();

3. Summary

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!

Statement:
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