JS函数-函数声明和函数表达式之间的恩怨

“函数声明”和“函数表达式”其实说白了 就是定义函数的方式

函数声明:

function 函数名(){.....}

通过上面方式定义的函数就是函数声明

函数表达式:通过函数表达式定义函数的方式比较多

1. var a = function test(){...} // 这是命名的函数表达式

  var a = function(){...} // 这是匿名的函数表达式

2. 将“函数声明”定义的函数 用一对小括号括起来,这样也形成了函数表达式

(function test(){.....})  //这样也是函数表达式

3. 还有就是在“函数声明”前加位运算符 也能构成函数表达式

例如:这些都是函数表达式

~function test(){.....}
+function test(){.....}
-function test(){.....}
!function test(){.....}

区别: 函数声明 和 函数表达式 有哪些区别那??

1.函数表达式可以直接 在后面加小括号执行(这就是函数自执行),而函数声明不可以

例如:

var a = function test() {
        alert("hello");
}
 // 这是一个函数表达式,在这个表达式后面加个括号,就可以自动执行函数了
var a = function test() {
        alert("hello");// 刷新页面就弹出hello了
 }();

而函数声明的方式 加个小括号是不可以执行的,例如 浏览器会提示这种写法是错误的

function test() {
        alert("hello");
}();

2.函数声明 可以 被预解析,而函数表达式不可以;如果不明白js预解析的小伙伴,请参考另一篇文章《JS预解析

例如:

 window.onload = function () {
        test();
        function test() { // 函数声明
            alert("hello");
        }
}

通过函数声明的方式定义的函数是可以被预解析的,所以在function test()之前调用test()函数,自然弹出hello,

 window.onload = function () {
        a();
        var a = function () { // 函数表达式
            alert("hello");
        }
}

通过函数表达式的方式定义的函数是不能被预解析的,所以在函数之前调用a(),就会报错

再看一个例子:

window.onload = function () {
        a();
       if(true){
           function a() {
               alert("1");
           }
       }else{
           function a() {
              alert("2");
           }
       }
}

我们本来想让if成立的时候弹出1,不成立弹出2

但是因为js会预解析,所以永远都是弹出2;但是使用函数表达式就可以避免这种情况

window.onload = function () {
       if(true){
           var a = function() {
               alert("1");
           }
       }else{
           var a = function() {
              alert("2");
           }
       }
       a();
 }

因为函数表达式不会被预解析,所以会按正常的逻辑进行,自然就弹出的是1

所以记住: 在写程序的时候,如果需要根据不同的条件判断 来决定执行不同的函数,那么此时一定要用“函数表达式”的形式来定义函数。这样可以避免很多错误发生

时间: 2024-10-14 00:44:17

JS函数-函数声明和函数表达式之间的恩怨的相关文章

JavaScript进阶系列01,函数的声明,函数参数,函数闭包

本篇主要体验JavaScript函数的声明.函数参数以及函数闭包. □ 函数的声明 ※ 声明全局函数 通常这样声明函数: function doSth() { alert("可以在任何时候调用我"); } 通过这种方式声明的函数属于Window对象,可以在任何地方调用,即在doSth方法的之前和之后都可以调用. 可以在doSth方法之前调用: doSth(); function doSth() { alert("可以在任何时候调用我"); } 可以在doSth方法之

函数的声明和定义的区别

函数声明和定义的区别(1) C语言编译系统是由上往下编译的.一般被调函数放在主调函数后面的话,前面就该有声明.不然C由上往下的编译系统将无法识别.正如变量必须先声明后使用一样,函数也必须在被调用之前先声明,否则无法调用!函数的声明可以与定义分离,要注意的是一个函数只能被定义一次,但可以声明多次. 函数声明由函数返回类型.函数名和形参列表组成.形参列表必须包括形参类型,但是不必对形参命名.这三个元素被称为函数原型,函数原型描述了函数的接口.定义函数的程序员提供函数原型,使用函数的程序员就只需要对函

函数声明和函数定义的区别

1 "函数的声明"指函数的返回值类型 函数名 函数的参数列表:"函数的定义"不仅包括以上,还包括函数体的实现. 2 "函数的定义"如果在调用函数行的前面时,则不需要函数声明.否则需要在该调用函数行的前面进行函数声明. 3 如果一个函数中有多个默认参数,则形参分布中,默认参数应从右至左逐渐定义.当调用函数时,只能向左匹配参数.. 1 #include "stdafx.h" 2 3 int _tmain(int argc, _TC

C++ 函数模板一(函数模板定义)

//函数模板定义--数据类型做参数 #include<iostream> using namespace std; /* 函数模板声明 1.函数模板定义由模板说明和函数定义组成,并且一个模板说明对应一个函数定义 2.模板说明的类属参数必须在函数定义中至少出现一次 3.函数参数表中可以使用类属类型参数,也可以使用一般类型参数 */ /* template关键字告诉c++编译器现在要进行泛型编程 typename或者class告诉c++编译器T是一个数据类型,不要进行语法检查 typename和c

C++类的成员函数(在类外定义成员函数、inline成员函数)

类的成员函数(简称类函数)是函数的一种,它的用法和作用和前面介绍过的函数基本上是一样的,它也有返回值和函数类型,它与一般函数的区别只是:它是属于一个类的成员,出现在类体中.它可以被指定为private(私有的).public (公用的)或protected(受保护的). 在使用类函数时,要注意调用它的权限(它能否被调用)以及它的作用域(函数能使用什么范围中的数据和函数).例如私有的成员函数只能被本类中的其它成员函数所调用,而不能被类外调用.成员函数可以访问本类中任何成员(包括私有的和公用的),可

JS中函数声明与函数表达式的不同

Js中的函数声明是指下面的形式: function functionName(){ } 这样的方式来声明一个函数,而函数表达式则是类似表达式那样来声明一个函数,如: var functionName = function(){ } 可能很多朋友在看到这两一种写法时会产生疑惑,这两种写法差不多,在应用中貌似也都是可行的,那他们有什么差别呢? 事实上,js的解析器对函数声明与函数表达式并不是一视同仁地对待的.对于函数声明,js解析器会优先读取,确保在所有代码执行之前声明已经被解析,而函数表达式,如同

JS函数声明和函数表达式的关系

1.函数声明 1 // 函数声明 2 function funDeclaration(type){ 3 return type==="Declaration"; 4 } 2.函数表达式 // 函数表达式 var funExpression = function(type){ return type==="Expression"; } JS代码在解析时会进行函数提升,因此在同一个作用域内,不管函数声明在哪里定义,该函数都可以进行调用.而函数表达式的值是在JS运行时确定

JS定义函数的两种方式:函数声明和函数表达式

函数声明 关于函数声明的方式,它的一个重要的特性就是函数声明提升(function declaration hoisting),意思是在执行代码之前会先读取函数声明.这就意味着可以把函数声明放在调用它的语句后面,如下所示: 1 sayHi(); //在调用语句的后面声明函数(function declaration hoisting) 2 function sayHi () { 3 console.log("Hello World"); 4 } 函数表达式 有多种表达方式,下面是最常见

JS高级 — 函数的声明和表达式

1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> 6 <title>函数的角色</title> 7 </head> 8 <body> 9 &