猿问

javascript的函数为什么不能像php那样先调用再申明?

javascript中,函数一定要这样:


function a(){}


a();

如果反了,就不行,比如:


a();

function a(){};

但是在php里就可以这样:


a();

function a(){}

同样是脚本语言,为什么javascript不能在调用后申明?javascript后续版本中是否会实现这样的功能?


DIEA
浏览 576回答 8
8回答

扬帆大鱼

function func(){...}这是函数声明,将在代码执行前被(完整地)加载到作用域的最前端,因此在代码编写中可以(在同作用域或上层作用域中)后置,即题主所说的先调用再声明。函数声明/变量声明都会被hoisting,其中函数声明会被完整前置,而变量声明仅前置声明部分而不前置赋值部分。代码栗子:(function(){  f1()   f2()  var f1 = function(){}  function f2(){}})()运行时:(function(){  var f1,function f2(){} //hoisting,被隐式提升的声明  f1() //ReferenceError: f1 is not defined  f2()  f1 = function(){}})()结论:js目前就支持题主所说的先调用再声明。

噜噜哒

对于提升 hoisting 的理解,必须强烈推荐 @nightire 前辈的博文:《理解 JavaScript(二)》@nightire 前辈在博文中详细讲解和介绍了 Scoping & Hoisting,题主耐心读完就基本清楚了。顺便提下我的一篇博文,也介绍了一点相关的内容,题主不妨也读一下。:)《细说 Javascript 函数篇(一) : 函数声明和函数表达式》

守候你守候我

你确定不可以?test();function test() {    console.log('test string');}

天涯尽头无女友

等你真正学会函数式编程,理解js里面的闭包以后,你才会明白js的函数比php里面的好用太多

HUX布斯

这样应该是统一规范语言,兼容各种浏览器。

喵喵时光机

楼主是怎么得到这个结论的。alert(a());function a(){return 1;}//1这样的代码是可以运行的。alert(a());var a=function(){return 1;}//error: unexpected indentifier这样的代码才会报错。因为函数声明会在js解析器解析时候率先解析,保证其他代码执行之前,函数可用。而函数表达式必须要等到代码解析器解析到他所在代码行,才会被解释执行。

白板的微信

楼主,你没搞懂JS的函数声明提升。a();function a(){};这个是可以执行的,而像下面这样是不行a();   //a是undefined,a已是已经声明了,因为var a,但是未赋值var a = function(){};
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答