函数声明与函数表达式

specialCoder
  • 2.1k

犀牛书上有段话不理解在强调什么,求大神们指教:

尽管函数声明和函数表达式都包含了相同的函数名,但是二者仍然不同。两种方式都创建了新的函数对象,但函数声明语句中的函数名是一个变量名,变量指向函数对象。
var f=function(){};
function f(){}

回复
阅读 1.9k
4 个回答
BetaRabbit
  • 1.4k
✓ 已被采纳

这个就是说var f = function () {}f是个变量,只是他的指向是一个函数对象,而function f () {}f本身就是一个函数对象。

console.log(f);// function f(){console.log(2);}
var f=function(){console.log(1);};
function f(){console.log(2);}

变量声明提升之后 实际上的运行顺序是

var f;
function f(){console.log(2);}
console.log(f);// function f(){console.log(2);}
f=function(){console.log(1);};

所以两种声明方式在运行时候还是有区别的

这个其实是变量和函数的预解释问题。在当前作用域下,在JS代码执行之前,浏览器会对带var和带function进行提前声明或定义;在浏览器解析代码的过程中,用var声明的变量只声明不定义,值是undefined。而function既声明又定义。function()这种形式会在预解释阶段开辟一个空间地址,把函数体中的所有JS代码做为字符串存在这个空间,把空间地址赋值给函数名。而var fn = function这种形式只有在fn执行的时候才会拥有私有作用域。

第一个是将变量f指向一个匿名函数,第二个是声明一个函数名为f的函数

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏