javascript 两种声明函数的方式的分析

 更新时间:2017年02月08日 10:06:24   投稿:lqh  
这篇文章主要介绍了javascript 两种声明函数的方式的分析的相关资料,需要的朋友可以参考下

javascript 声明函数

JavaScript有两种声明函数的方式,一个是函数表达式定义函数,也就是我们说的匿名函数方式,一个是函数语句定义函数,下面看代码:

/*方式一*/
var FUNCTION_NAME = function() { /* FUNCTION_BODY */};
/*方式二*/
function FUNCTION_NAME () { /* FUNCTION_BODY */}; 

区别一

方式一的声明方式是先声明后使用

方式二的声明方式可以先调用,后声明

/*方式一:
 *先声明后使用
 */

//f1();这里调用就会出错 
var f1 = function () {
     alert("var方式");
}
f1();//这里使用才正确

/*方式二:
 *可以先使用后声明
 */

f2(); //这里调用可以正常执行 
function f2 () {
     alert("function方式");
}
f2();//这里调用可以正常执行

区别二

//方式一
var FUNCTION_NAME = function() { /* FUNCTION_BODY */};
/*
这种方式,编译后变量声明 FUNCTION_NAME 会“被提前”了,但是他的赋值(也就是FUNCTION_BODY)并不会被提前。匿名函数只有在被调用时才被初始化。
*/
//方式二
function FUNCTION_NAME () { /* FUNCTION_BODY */}; 
/*
这种方式, 编译后 函数声明 和 赋值 都会被提前。
即函数声明过程在整个程序执行之前的预处理就完成了,所以只要处于同一个作用域,就可以访问到,即使在定义之前调用它也可以。
*/

下面看一个例子:

function f() {
 alert('1');
}

f(); // 弹窗内容是:2

function f() {
 alert ('2');
}

运行时 f() 执行的是alert (‘2');主要原因是JavaScript 函数声明的“提前”行为,简而言之,就是Javascript允许我们在变量和函数被声明之前使用它们,而第二个定义覆盖了第一种定义。换句话说,上述代码编译之后相当于:

function f() {
 alert('1');
}

function f() {
 alert ('2');//申明前置了,但因为这里的申明和赋值在一起,所以一起前置
}

f(); // 弹窗内容是:2

下面再看一个例子:

var f= function() {
 alert('1');
}

f(); // 弹窗内容是:1

function f() {
 alert ('2');
}

这里就是我们期待的behavior,这段程序编译之后相当于:

var f; //申明前置了
function f() {
 alert('1');
}

f(); // 弹窗内容是:1

function f() {
 alert ('2');
}

最后再看一个例子:

f(); //第一次调用函数 弹窗内容是:2

var f= function() {
 alert('1');
}

f(); //第二次调用函数 弹窗内容是:1

function f() {
 alert ('2');
}
f(); //第三次调用函数 弹窗内容是:1

看到结果大家应该都明白了吧。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

  • Visual Studio Code上添加小程序自动补全插件的操作方法

    Visual Studio Code上添加小程序自动补全插件的操作方法

    这篇文章主要介绍了Visual Studio Code上添加小程序自动补全插件的操作方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • C++指针作为函数的参数进行传递时需要注意的一些问题

    C++指针作为函数的参数进行传递时需要注意的一些问题

    当指针作为函数的参数进行传递的时候,本质上还是进行的“值传递”,也就是复制了一个新的指向该地址的指针变量
    2013-10-10
  • 更优雅的C++字符串格式化实现方法详解

    更优雅的C++字符串格式化实现方法详解

    在用C++编写代码时,经常需要用到字符串拼接及格式化,尤其是在拼写sql语句时。所以本文为大家介绍了更优雅的C++字符串格式化实现方法,希望对大家有所帮助
    2023-04-04
  • C++中单调栈的基本性质介绍

    C++中单调栈的基本性质介绍

    这篇文章主要介绍了单调栈的基本性质介绍,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C++基于socket多线程实现网络聊天室

    C++基于socket多线程实现网络聊天室

    这篇文章主要为大家详细介绍了C++基于socket多线程实现网络聊天室,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • C++ TensorflowLite模型验证的过程详解

    C++ TensorflowLite模型验证的过程详解

    这篇文章给大家介绍了C++ TensorflowLite模型验证的过程,测试代码,主要是RunInference()和read_file(),详细操作过程跟随小编一起看看吧
    2021-08-08
  • C语言绘制简单时钟小程序

    C语言绘制简单时钟小程序

    这篇文章主要为大家详细介绍了C语言绘制简单时钟小程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • Qt中鼠标点击的几种状态

    Qt中鼠标点击的几种状态

    在Qt中,鼠标点击按钮通常会触发一系列的事件,包括pressed、released、clicked等,本文主要介绍了Qt中鼠标点击的几种状态,具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12
  • C++ Boost Xpressive示例分析使用

    C++ Boost Xpressive示例分析使用

    Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称
    2022-11-11
  • C语言实现找出二叉树中某个值的所有路径的方法

    C语言实现找出二叉树中某个值的所有路径的方法

    这篇文章主要介绍了C语言实现找出二叉树中某个值的所有路径的方法,针对数据结构中二叉树的实用操作技巧,需要的朋友可以参考下
    2014-09-09

最新评论