Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用函数表达式而不是函数声明的优点?_Javascript_Function - Fatal编程技术网

Javascript 使用函数表达式而不是函数声明的优点?

Javascript 使用函数表达式而不是函数声明的优点?,javascript,function,Javascript,Function,如图所示,函数声明和函数表达式之间存在一些差异 函数表达式与函数声明相比有一个缺点,如果在声明函数表达式之前调用它,它将给出一个错误 我只想知道使用函数表达式的优点,因为我似乎只看到上面提到的缺点。我可以举个例子 函数表达式: alert(foo()); // ERROR! foo wasn't loaded yet var foo = function() { return 5; } 功能声明: alert(foo()); // Alerts 5. Declarations are loa

如图所示,函数声明和函数表达式之间存在一些差异

函数表达式与函数声明相比有一个缺点,如果在声明函数表达式之前调用它,它将给出一个错误

我只想知道使用函数表达式的优点,因为我似乎只看到上面提到的缺点。我可以举个例子

函数表达式:

alert(foo()); // ERROR! foo wasn't loaded yet
var foo = function() { return 5; } 
功能声明:

alert(foo()); // Alerts 5. Declarations are loaded before any code can run.
function foo() { return 5; } 

通常,当您需要在多个位置访问某个函数时,应该随时使用声明的函数

在javascript中,声明函数仅仅是
foo=function(){…}
的语法糖

两者都有各自的用途,在个别情况下都有微妙(难以量化)的优势

一般来说,它的优点是它是一个“一次性”函数。它的存在是为了完成一项单一、快速的工作,而给它单独的声明将是浪费时间和空间。表达式函数所能做的任何事情都是声明函数所不能做的。正如我所说,这很微妙,也很难量化。除此之外,我能看到的唯一优势是动态更改函数调用

例如,此代码:

function foo(){
    console.log('foo');
}

function bar(){
    console.log('bar');
}

var myFn = foo;

myFn();

setInterval(function(){
    if(myFn === foo) myFn = bar;
    else myFn = foo;
}, 5000);

setInterval(function(){
    myFn()
}, 6000);
function foo(){
    console.log('foo');
}

setInterval(function(){
    function foo(){
        console.log('Changed foo');
    }

    foo()
}, 5000)

setInterval(function(){
    foo()
}, 5000)
它将永远不会记录相同的事情,因为您重新分配了一个全局变量,每个innerscope函数都将更改,而以下代码:

function foo(){
    console.log('foo');
}

function bar(){
    console.log('bar');
}

var myFn = foo;

myFn();

setInterval(function(){
    if(myFn === foo) myFn = bar;
    else myFn = foo;
}, 5000);

setInterval(function(){
    myFn()
}, 6000);
function foo(){
    console.log('foo');
}

setInterval(function(){
    function foo(){
        console.log('Changed foo');
    }

    foo()
}, 5000)

setInterval(function(){
    foo()
}, 5000)

将记录两个不同的内容。您只能更改当前作用域函数,不能更改全局。

我的实验:在不同作用域中使用该函数时需要使用的函数表达式。比如说

function outer(){
       function inner(){

       }
}
outer();
inner();// Error ...calling inner..will not be found..
-这是行不通的。但是

var inner;
function outer(){
 inner=function(){

       }
}
outer();
inner();// will work

-这将起作用

与“提升”相关的可能的重复。对于函数声明,整个函数被提升。对于函数表达式,只有变量被提升。问题是,这个问题没有很好地表达出来。它更像是开箱即用的视图。在不同的情况下,优点是缺点(同时)。所以问题应该是,在什么情况下……我知道大多数时候我会使用声明函数,但我想知道使用表达式而不是声明函数有什么好处。好处是它是一个“一次性”函数。它的存在是为了完成一项单一、快速的工作,而给它单独的声明将是浪费时间和空间。表达式函数所能做的任何事情都是声明函数所不能做的。就像我说的,这很微妙,很难量化。“在javascript中,声明函数只是foo=function(){…}的语法糖。”不,这不是语法糖。语法上的糖分可以去掉,操作将保持不变,而
foo=function(){}
function foo(){}
具有不同的语义。也就是说,这就是提升的工作原理——声明总是被提升,这使得代码的行为不同,例如,
foo();函数foo(){}
正确。一个更微妙的变化是
if(false)函数foo(){}
,尽管
if
语句没有执行,它仍然被声明和提升。感谢您提供的xlear可视示例,但是在函数外部内部一次获取内部有什么好处呢。创建一个对象或创建另一个表达式作为函数inner()不是更好吗?我不知道;我不明白你为什么要在现实世界中做第二个例子。这只是一个例子。但是当我们处理javascript闭包时,我们需要这种技术@DanielRamirez Escuderople请通过以下步骤帮助您: