JavaScript 中定义函数用 var foo = function () {} 和 function foo()区别介绍

 更新时间:2018年03月01日 10:02:02   作者:归去来兮-不如去兮  
这篇文章主要介绍了JavaScript 中定义函数用 var foo = function () {} 和 function foo()区别介绍,需要的朋友可以参考下

某天写代码突然县道这个问题,顺势总结一波

JavaScript 函数和变量声明的“提前”(hoist)行为

简单的说 如果我们使用 匿名函数

var a = {}

这种方式, 编译后变量声明a 会“被提前”了,但是他的赋值(也就是a)并不会被提前。

也就是,匿名函数只有在被调用时才被初始化。

如果使用

function a () {};

这种方式, 编译后函数声明和他的赋值都会被提前。

也就是说函数声明过程在整个程序执行之前的预处理就完成了,所以只要处于同一个作用域,就可以访问到,即使在定义之前调用它也可以。

看一个例子

function hereOrThere() { //function statement
  return 'here';
}
console.log(hereOrThere()); // alerts 'there'
function hereOrThere() {
  return 'there';
}

我们会发现alert(hereOrThere) 语句执行时会alert('there')!这里的行为其实非常出乎意料,主要原因是JavaScript 函数声明的“提前”行为,简而言之,就是Javascript允许我们在变量和函数被声明之前使用它们,而第二个定义覆盖了第一种定义。换句话说,上述代码编译之后相当于

function hereOrThere() { //function statement
 return 'here';
}
function hereOrThere() {//申明前置了,但因为这里的申明和赋值在一起,所以一起前置
 return 'there';
}
console.log(hereOrThere()); // alerts 'there'

我们期待的行为

var hereOrThere = function () { // function expression
  return 'here';
};
console.log(hereOrThere()); // alerts 'here'
hereOrThere = function () {
  return 'there';
};

这段程序编译之后相当于:

var hereOrThere;//申明前置了
hereOrThere = function() { // function expression
 return 'here';
};
console.log(hereOrThere()); // alerts 'here'
hereOrThere = function() {
 return 'there';
};

总结

以上所述是小编给大家介绍的JavaScript 中定义函数用 var foo = function () {} 和 function foo()区别介绍,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • javascript网页随机点名实现过程解析

    javascript网页随机点名实现过程解析

    这篇文章主要介绍了javascript实现网页随机变色及实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • TS中最常见的声明合并(接口合并)

    TS中最常见的声明合并(接口合并)

    这篇文章主要介绍了TS中最常见的声明合并:接口合并,TS中的声明合并,指的就是编译器会针对同名的声明合并为一个声明,合并后的声明会同时拥有原先两个或多个声明的特性,接口的合并也是一样,它会将双方的成员放到一个同名的接口里,更多详细内容请参考下面文章内容

    2021-12-12
  • bootstrap学习笔记之初识bootstrap

    bootstrap学习笔记之初识bootstrap

    Bootstrap是一款目前非常流行的前端框架,简单的说,就是html,css,javascript的工具集。本文给大家介绍bootstrap学习笔记之初识bootstrap,感兴趣的朋友一起学习吧
    2016-06-06
  • JS实现获取自定义属性data值的方法示例

    JS实现获取自定义属性data值的方法示例

    这篇文章主要介绍了JS实现获取自定义属性data值的方法,结合实例形式较为详细的分析了javascript针对自定义属性data的相关操作技巧,需要的朋友可以参考下
    2018-12-12
  • js仿QQ中对联系人向左滑动、滑出删除按钮的操作

    js仿QQ中对联系人向左滑动、滑出删除按钮的操作

    这篇文章主要介绍了js仿QQ中对联系人向左滑动、滑出删除按钮的操作,即编写一个js向左滑动删除 交互特效的插件,感兴趣的小伙伴们可以参考一下
    2016-04-04
  • 巧方法 JavaScript获取超链接的绝对URL地址

    巧方法 JavaScript获取超链接的绝对URL地址

    这篇文章主要为大家详细介绍了一个非常巧妙的方法,JavaScript如何获取超链接的绝对URL地址,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • javascript中搜索数组的四种方法示例详解

    javascript中搜索数组的四种方法示例详解

    我们在学到js中数组的时候,我们会接触到js中数组的一些方法这些方法对我们来说,可以很便利的达到我们想要的结果,下面这篇文章主要给大家介绍了关于javascript中搜索数组的四种方法,需要的朋友可以参考下
    2022-12-12
  • js获取元素到文档区域document的(横向、纵向)坐标的两种方法

    js获取元素到文档区域document的(横向、纵向)坐标的两种方法

    获取页面中元素到文档区域document的横向、纵向坐标,在js控制元素运动的过程中,对于页面元素坐标位置的获取是经常用到的,这里主要总结下两种方法
    2013-05-05
  • JavaScript中判断变量是否存在的四种常用方法整理

    JavaScript中判断变量是否存在的四种常用方法整理

    在Javascript中我们通常判断一个变量是否存在,即不为null或者undefined,这篇文章主要给大家介绍了关于JavaScript中判断变量是否存在的四种常用方法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-08-08
  • 浅谈javascript中for in 和 for each in的区别

    浅谈javascript中for in 和 for each in的区别

    两个的作用都用来遍历对象,但为什么有了for in语句了还要for each in语句呢,后来看了下for each in开发的文档,for each in是作为E4X标准的一部分在javascript 1.6中发布的,而且它不是ECMAScript标准的一部分
    2015-04-04

最新评论