声明变量中的JavaScript函数?

声明变量中的JavaScript函数?,javascript,function,Javascript,Function,我正在阅读本教程: 里面有一个教训说: // A simple function that adds one var plusOne = function (x) { return x + 1; }; 我习惯于看到这样的函数: function myFunction() { return x + 1; }; 第一个和第二个有什么区别?最后。两者之间没有区别。只是声明上的差异。唯一的区别是第一个函数: var plusOne = function (x) { retur

我正在阅读本教程:

里面有一个教训说:

// A simple function that adds one
var plusOne = function (x) {
    return x + 1;
};
我习惯于看到这样的函数:

function myFunction() {
    return x + 1;
};

第一个和第二个有什么区别?最后。两者之间没有区别。只是声明上的差异。

唯一的区别是第一个函数:

var plusOne = function (x) { return x + 1; }; function myFunction() { return x + 1; }; var plusOne=函数(x){ 返回x+1; }; 在运行时定义,而另一个函数:

var plusOne = function (x) { return x + 1; }; function myFunction() { return x + 1; }; 函数myFunction(){ 返回x+1; }; 是在脚本块的分析时定义的。

请阅读@编写的。他出色地解释了
函数声明和
函数表达式之间的区别。引用他所写的话:

函数可以用不同的方式声明:

1-使用分配给变量乘法的构造函数定义的函数:

2-名为multiply的函数的函数声明:

3-分配给变量乘法的函数表达式:

4-指定给变量乘法的命名函数表达式func_name:

简单地说,以下代码可以是函数声明,也可以是函数表达式,具体取决于上下文:

function foo() {}
以上是一个
函数声明

0, function foo() {}
以上是一个
函数表达式
。@CMS在前面的回答中更详细地解释了两者之间的区别

关于你的问题:

// A simple function that adds one
var plusOne = function (x) {   // a function expression is assigned to a variable
    return x + 1;
};

function myFunction() {        // a simple function declaration
    return x + 1;
};

它们做的事情几乎相同,但两者都有差异和原因。第一个函数是函数表达式,因为它被赋给变量。此外,与函数表达式无关,它是匿名函数,因为它没有函数名。第二个是函数声明,因为它不是另一个表达式的一部分,是“脚本函数的源元素(脚本中的非嵌套语句或体函数)。(我不太知道如何解释源元素,所以我从Mozilla文档复制了它)。它还有一个函数名myFunction。此外,与函数表达式定义的函数不同,函数也可以在函数声明之前使用

以下使用函数表达式的示例不起作用:

plusOne(1);
var plusOne = function (x) {
    return x + 1;
};
以下使用函数声明将起作用:

plusOne(1);
function plusOne(x) {
    return x + 1;
};

此外,鉴于您看到此函数声明的链接主题是闭包,我将继续解释为什么可以使用函数表达式和匿名函数。有时,一个函数根本不需要名字,可以是匿名的,因为没有人需要用它的名字来调用它。函数表达式可以用于您可能已经了解的东西,称为闭包。闭包是指函数将变量封闭起来以便以后在其中使用,从而阻止任何外部作用域到达它。它们有点难以解释,如果不反复阅读各种示例并亲自尝试,也很难理解

假设您有足够的基本javascript知识(对于循环、创建和附加dom元素以及onclick),以下面的代码为例,这与我自己发现闭包之前遇到的问题类似。先通读一遍,不要运行代码,试着弄清楚当您单击每个按钮/div时会发生什么

function addButtons() {
    for (var i=0; i<3; i++) {
        button = document.createElement("div");
        button.innerHTML = "Button " + i;
        button.onclick = function () {
            alert(i);
        };
        document.body.appendChild(button);
    }
}
addButtons();
函数addButtons(){
对于(var i=0;i
是一个变量语句,其初始值设定项是函数表达式,而

function plusTwo(x) {
    return x + 2;
}
是一个函数声明

要了解两者之间的区别,您需要了解变量是如何初始化的:

首先,JavaScript变量有函数作用域(这与大多数其他流行编程语言不同,后者的变量是块作用域),变量声明发生在代码求值之前

这意味着variable语句在函数体中的位置无关紧要:从概念上讲,它与位于顶部的声明相同

但是,变量将被预先初始化为
未定义
,只有在代码执行过程中遇到variable语句时,才会分配实际值

函数声明不是这样:函数声明是在声明绑定时计算的,即在一般代码执行之前

特别是,这意味着在声明之前的语句中调用声明的函数是完全有效的,也就是说,这样可以很好地工作:

alert(plusTwo(42));
function plusTwo(x) {
    return x + 2;
};
鉴于

alert(plusOne(42));
var plusOne = function (x) {
    return x + 1;
};
将失败,因为它在概念上等同于

var plusOne = undefined;
alert(plusOne(42));
plusOne = function (x) {
    return x + 1;
};

它是在解析时声明的,没有定义。-1-JavaScript中的所有内容都是在运行时计算的。没有单独的“解析时间”.JavaScript是一种解释语言。@Aadit:仅因为解释了JavaScript并不意味着代码执行是在一个过程中进行的;一般来说,解释将分阶段进行,Sudhir的回答基本上是正确的,即使他的术语不是-standard@Aadit-根据Christoph所说,JavaScript引擎eFinite会对代码进行两次遍历,如果您使用function语句
function myFunction()
语法,这一事实在任何浏览器中都很容易演示。这样的声明(以及变量声明)都是“挂起”的;您可以从脚本中出现在函数前面的代码中调用以这种方式声明的函数—如果只有一个过程,这显然是行不通的。您可以将第一个过程称为“解析时间”以外的内容,但本质上就是这样。顺便说一句,即使他的术语是非标准的,也应该读一下。有时会有一些细微的差别。一些运行时会以我的身份显示第一个示例(函数表达式)
function plusTwo(x) {
    return x + 2;
}
alert(plusTwo(42));
function plusTwo(x) {
    return x + 2;
};
alert(plusOne(42));
var plusOne = function (x) {
    return x + 1;
};
var plusOne = undefined;
alert(plusOne(42));
plusOne = function (x) {
    return x + 1;
};