函数的声明方式
在定义一个函数的时候通常有两种声明方式:
foo(){}; // 函数声明
var foo = function(){}; // 函数表达式
不同之处
1、函数表达式后面加括号可以直接执行
2、函数声明会提前预解析
预解析
让我们先看一个例子:
foo(); // 函数声明
foo_later(); // foo_later is not a function
function foo(){ console.log('函数声明'); }
var foo_later = function(){ console.log('函数表达式'); }
可以看到,函数声明foo被预解析了,它可以在其自身代码之前执行;而函数表达式foo_later则不能。要解决这个问题,我们先要弄清楚JavaScript解析器的工作机制。
变量提升(hoist)
JavaScript解析器会在自身作用域内将变量和函数声明提前(hoist),也就是说,上面的例子其实被解析器理解解析成了以下形式:
function foo(){ console.log('函数声明'); } // 函数声明全部被提前
var foo_later; // 函数表达式(变量声明)仅将变量提前,赋值操作没有被提前
foo();
foo_later();
foo_later = function(){ console.log('函数表达式'); }
这样也就可以解释,为什么在函数表达式之前调用函数,会返回错误了,因为它还没有被赋值,只是一个未定义变量,当然无法被执行。
同样的,我们也可以试着猜测下面这段代码的输出结果:
console.log(declaredLater); var declaredLater = "Now it's defined!"; console.log(declaredLater);
该段代码可以被解析成一下形式:
var declaredLater; console.log(declaredLater); // undefined declaredLater = "Now it's defined!"; console.log(declaredLater); // Now it's defined!
变量声明被提到最前(所以不会报出变量不存在的错误),但赋值没有被提前,所以第一次的输出结果是undefined。
需要注意的是
由于函数声明会被预解析,所以不要使用此种方法来声明不同函数。尝试猜想下面例子的输出结果:
if(true){
function aaa(){
alert('1');
}
}
else{
function aaa(){
alert('2');
}
}
aaa();
与我们预想的不同,该段代码弹出的是“2”.这是因为两个函数声明在if语句被执行之前就被预解析了,所以if语句根本没有用,调用aaa()的时候直接执行了下面的函数。
总结
通过上面的讲解可以总结如下:
•变量的声明被提前到作用域顶部,赋值保留在原地
•函数声明整个“被提前”
•函数作为值赋给变量时只有变量“被提前”了,函数没有“被提前”
通过练习上面的实例自己多感受一下。另外,作为最佳实践:变量声明一定要放在作用域/函数的最上方(JavaScript 只有函数作用域!)。
以上这篇全面了解函数声明与函数表达式、变量提升就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持小牛知识库。
函数是JavaScript中的一等对象,这意味着可以把函数像其它值一样传递。 一个常见的用法是把匿名函数作为回调函数传递到异步函数中。 函数声明 function foo() {} 上面的方法会在执行前被 解析(hoisted),因此它存在于当前上下文的任意一个地方, 即使在函数定义体的上面被调用也是对的。 foo(); // 正常运行,因为foo在代码运行前已经被创建 function foo
本文向大家介绍JavaScript中Hoisting详解 (变量提升与函数声明提升),包括了JavaScript中Hoisting详解 (变量提升与函数声明提升)的使用技巧和注意事项,需要的朋友参考一下 本文主要给大家介绍了关于JavaScript中Hoisting(变量提升与函数声明提升)的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。 如何将 函数声明 / 变量 “
本文向大家介绍函数声明与函数表达式有什么区别?相关面试题,主要包含被问及函数声明与函数表达式有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 函数声明 function fn() { ///... } 函数表达式 const aa = function() { ///... } 区别: 1.函数声明,函数名必须有,在函数表达式中可以省略函数名 2.函数声明会被预解析,函数表达式不会
本文向大家介绍javascript函数声明和函数表达式区别分析,包括了javascript函数声明和函数表达式区别分析的使用技巧和注意事项,需要的朋友参考一下 平时再用js写函数的时候,一般都是以惯例 function fn () {} 的方式来声明一个函数,在阅读一些优秀插件的时候又不免见到 var fn = function () {} 这种函数的创建,究竟他们用起来有什么区别呢,今天就本
本文向大家介绍举例子说明javascript的变量声明提升和函数声明提升相关面试题,主要包含被问及举例子说明javascript的变量声明提升和函数声明提升时的应答技巧和注意事项,需要的朋友参考一下 先声明函数名,再声明 var 变量名,然后按顺序从上到下赋值。
本文向大家介绍浅析javascript中函数声明和函数表达式的区别,包括了浅析javascript中函数声明和函数表达式的区别的使用技巧和注意事项,需要的朋友参考一下 javascript中声明函数的方法有两种:函数声明式和函数表达式. 区别如下: 1).以函数声明的方法定义的函数,函数名是必须的,而函数表达式的函数名是可选的. 2).以函数声明的方法定义的函数,函数可以在函数声明之前调用,而函数
本文向大家介绍JavaScript中提前声明变量或函数例子,包括了JavaScript中提前声明变量或函数例子的使用技巧和注意事项,需要的朋友参考一下 如题所示,看下面的示例。 (可以使用Chrome浏览器,然后F12/或者右键,审查元素.调出开发者工具,进入控制台console输入) (使用技巧: 控制台输入时Shift+Enter可以中途代码换行) 执行时的截图如下所示: 解释如下: 在Jav
本文向大家介绍JavaScript中的函数申明、函数表达式、箭头函数,包括了JavaScript中的函数申明、函数表达式、箭头函数的使用技巧和注意事项,需要的朋友参考一下 JavaScript中的函数可以通过几种方式创建,如下。 函数声明和表达式之间的差别是 JavaScript 解释器中存在一种变量声明被提升的机制,也就是说函数声明会被提升到作用域的最前面,即使写代码的时候是写在最后面,也还是会