Table of Contents
回复内容:
Home Backend Development PHP Tutorial javascript的函数为什么不能像php那样先调用再申明?

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

Jun 06, 2016 pm 08:45 PM
javascript php

javascript中,函数一定要这样:

<code>function a(){}

a();
</code>
Copy after login
Copy after login

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

<code>a();
function a(){};
</code>
Copy after login
Copy after login
Copy after login

但是在php里就可以这样:

<code>a();
function a(){}
</code>
Copy after login
Copy after login

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

回复内容:

javascript中,函数一定要这样:

<code>function a(){}

a();
</code>
Copy after login
Copy after login

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

<code>a();
function a(){};
</code>
Copy after login
Copy after login
Copy after login

但是在php里就可以这样:

<code>a();
function a(){}
</code>
Copy after login
Copy after login

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

  1. function func(){...}这是函数声明,将在代码执行前被(完整地)加载到作用域的最前端,因此在代码编写中可以(在同作用域或上层作用域中)后置,即题主所说的先调用再声明。
  2. 函数声明/变量声明都会被hoisting,其中函数声明会被完整前置,而变量声明仅前置声明部分不前置赋值部分

代码栗子:

(function(){
  f1() 
  f2()

  var f1 = function(){}
  function f2(){}
})()
Copy after login

运行时:

(function(){
  var f1,function f2(){} //hoisting,被隐式提升的声明

  f1() //ReferenceError: f1 is not defined
  f2()

  f1 = function(){}
})()
Copy after login

结论:
js目前就支持题主所说的先调用再声明。

http://jsfiddle.net/ZvLht/

目前ES5下是完全没有问题的,不过似乎在ES6中这种情况会有所改变,印象中应该是在 http://es6.ruanyifeng.com/ 这里看到过,不过不大记得在哪里了,你可以翻翻看。

对于提升 hoisting 的理解,必须强烈推荐 @nightire 前辈的博文:

《理解 JavaScript(二)》

@nightire 前辈在博文中详细讲解和介绍了 Scoping & Hoisting,题主耐心读完就基本清楚了。

顺便提下我的一篇博文,也介绍了一点相关的内容,题主不妨也读一下。:)

《细说 Javascript 函数篇(一) : 函数声明和函数表达式》

你确定不可以?

<code>test();
function test() {
    console.log('test string');
}
</code>
Copy after login

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

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

楼主是怎么得到这个结论的。
alert(a());
function a(){
return 1;
}//1
这样的代码是可以运行的。

alert(a());
var a=function(){
return 1;
}//error: unexpected indentifier
这样的代码才会报错。

因为函数声明会在js解析器解析时候率先解析,保证其他代码执行之前,函数可用。而函数表达式必须要等到代码解析器解析到他所在代码行,才会被解释执行。

楼主你确定试验了你的代码了么

楼主问题本身就是错误的

楼主,你没搞懂JS的函数声明提升。

<code>a();
function a(){};
</code>
Copy after login
Copy after login
Copy after login

这个是可以执行的,而像下面这样是不行

<code>a();   //a是undefined,a已是已经声明了,因为var a,但是未赋值
var a = function(){};</code>
Copy after login
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
2 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
Repo: How To Revive Teammates
4 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: How To Get Giant Seeds
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

PHP 8.4 Installation and Upgrade guide for Ubuntu and Debian PHP 8.4 Installation and Upgrade guide for Ubuntu and Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 Installation and Upgrade guide for Ubuntu and Debian

CakePHP Project Configuration CakePHP Project Configuration Sep 10, 2024 pm 05:25 PM

CakePHP Project Configuration

CakePHP Date and Time CakePHP Date and Time Sep 10, 2024 pm 05:27 PM

CakePHP Date and Time

CakePHP File upload CakePHP File upload Sep 10, 2024 pm 05:27 PM

CakePHP File upload

CakePHP Routing CakePHP Routing Sep 10, 2024 pm 05:25 PM

CakePHP Routing

Discuss CakePHP Discuss CakePHP Sep 10, 2024 pm 05:28 PM

Discuss CakePHP

How To Set Up Visual Studio Code (VS Code) for PHP Development How To Set Up Visual Studio Code (VS Code) for PHP Development Dec 20, 2024 am 11:31 AM

How To Set Up Visual Studio Code (VS Code) for PHP Development

CakePHP Quick Guide CakePHP Quick Guide Sep 10, 2024 pm 05:27 PM

CakePHP Quick Guide

See all articles