JavaScript 中定义函数时用 var foo = function () {} 和 function foo() 的区别
2016-06-23 17:29
591 查看
作者:严肃
链接:https://www.zhihu.com/question/19878052/answer/32361868
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
这个问题其实非常好,最关键的区别在于JavaScript 函数和变量声明的“提前”(hoist)行为。
the Google style guide 建议我们采用方法一。
简单的说 如果我们使用 匿名函数
这种方式, 编译后变量声明FUNCTION_NAME 会“被提前”了,但是他的赋值(也就是FUNCTION_BODY)并不会被提前。
也就是,匿名函数只有在被调用时才被初始化。
如果我们使用
这种方式, 编译后函数声明和他的赋值都会被提前。
也就是说函数声明过程在整个程序执行之前的预处理就完成了,所以只要处于同一个作用域,就可以访问到,即使在定义之前调用它也可以。
请先看一个例子
我们会发现alert(hereOrThere) 语句执行时会alert('there')!这里的行为其实非常出乎意料,主要原因是JavaScript 函数声明的“提前”行为,简而言之,就是Javascript允许我们在变量和函数被声明之前使用它们,而第二个定义覆盖了第一种定义。换句话说,上述代码编译之后相当于
强烈推荐阅读下面文章,JavaScript 中对变量和函数声明的“提前(hoist)”
再看下面一个例子:
这里就是我们期待的behavior,这段程序编译之后相当于:
链接:https://www.zhihu.com/question/19878052/answer/32361868
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
这个问题其实非常好,最关键的区别在于JavaScript 函数和变量声明的“提前”(hoist)行为。
the Google style guide 建议我们采用方法一。
简单的说 如果我们使用 匿名函数
var FUNCTION_NAME = function() { /* FUNCTION_BODY */};
这种方式, 编译后变量声明FUNCTION_NAME 会“被提前”了,但是他的赋值(也就是FUNCTION_BODY)并不会被提前。
也就是,匿名函数只有在被调用时才被初始化。
如果我们使用
function FUNCTION_NAME () { /* FUNCTION_BODY */};
这种方式, 编译后函数声明和他的赋值都会被提前。
也就是说函数声明过程在整个程序执行之前的预处理就完成了,所以只要处于同一个作用域,就可以访问到,即使在定义之前调用它也可以。
请先看一个例子
function hereOrThere() { //function statement return 'here'; } alert(hereOrThere()); // alerts 'there' function hereOrThere() { return 'there'; }
我们会发现alert(hereOrThere) 语句执行时会alert('there')!这里的行为其实非常出乎意料,主要原因是JavaScript 函数声明的“提前”行为,简而言之,就是Javascript允许我们在变量和函数被声明之前使用它们,而第二个定义覆盖了第一种定义。换句话说,上述代码编译之后相当于
function hereOrThere() { //function statement return 'here'; } function hereOrThere() {//申明前置了,但因为这里的申明和赋值在一起,所以一起前置 return 'there'; } alert(hereOrThere()); // alerts 'there'
强烈推荐阅读下面文章,JavaScript 中对变量和函数声明的“提前(hoist)”
再看下面一个例子:
var hereOrThere = function() { // function expression return 'here'; }; alert(hereOrThere()); // alerts 'here' hereOrThere = function() { return 'there'; };
这里就是我们期待的behavior,这段程序编译之后相当于:
var hereOrThere;//申明前置了 hereOrThere = function() { // function expression return 'here'; }; alert(hereOrThere()); // alerts 'here' hereOrThere = function() { return 'there'; };
相关文章推荐
- 日期比较大小js
- 深入理解JavaScript系列
- Lcg框架组件说明
- DRP之JavaScript基础整理
- jsessionid的简单说明
- js 关键字 in
- js动态获取子复选项并设计全选及提交
- javascript小记——setTimeout调用方法总是提示未定义??
- js创建对象的几种方式
- JavaScript原型和继承
- 网页端中将表格数据和JSON数据读取(导出)到本地的excel和csv文件中
- Javascript基本介绍
- 使用JavaScriptCore在JS和OC间通信
- three.js 之旅 (三)
- js面向对象与继承
- 如何插入谷歌地图并获取javascript api 秘钥
- js的事件委托
- jsp表单提交的中文乱码问题
- phantomjs 另类用法
- jsp中调用servlet路径问题