像“ var foo = function bar()…”之类的Javascript函数?

代码是这样的(语法可能看起来很奇怪,但据我所知,它没有任何问题。还是存在?)


var add=function addNums(a, b) {                     

   return a+b;

 }                     

 alert("add: "+ add(2,3));           // produces 5

 alert("addNums: "+addNums(2,3));        // should also produce 5

addNums()被声明为一个函数。因此,当我将参数传递给它时,它也应该返回结果。


那么,为什么我没有得到第二个警告框?


杨魅力
浏览 456回答 3
3回答

蛊毒传说

问题您正在使用已命名的函数表达式 -函数表达式的名称在该函数范围之外不可用:// Function statementfunction statement() {    console.log("statement is a type of " + typeof statement);}statement();console.log("statement is a type of " + typeof statement);结果是:statement is a type of functionstatement is a type of function而:// Function expression with a namevar expression = function namedExpression() {    console.log("namedExpression is a type of " + typeof namedExpression);};expression();// namedExpression();  // uncommenting this will cause an exceptionconsole.log("expression is a type of " + typeof expression);console.log("namedExpression is a type of " + typeof namedExpression);将产生:namedExpression is a type of functionexpression is a type of functionnamedExpression is a type of undefined解决方案根据您要执行的操作,您想执行以下操作之一:更改函数声明以使用语句,然后为函数加上别名:function addNums(a, b) {    return a + b;}var add = addNums;别名都代表您的表情:var add = addNums = function addNums(a, b) {    return a + b;};为什么JavaScript用这种方式做事?命名函数表达式很有用,因为它们使您可以引用其内部的函数,并为您提供一个在调试器中查看的名称。但是,当您将函数用作值时,通常不希望其一部分泄漏到封闭范围内。考虑:(function setup() {    var config = retrieveInPageConfig();    if (config.someSetting) {        performSomeOtherSetup();    }    kickOffApplication();})();这是对函数表达式的完全合法使用-在这种情况下,您不希望名称setup泄漏到封闭范围内。将命名函数表达式分配给变量只是这种情况的一种特殊情况,它恰好看起来像函数语句声明。

哈士奇WWW

addNums是只在新定义函数的范围内都有效。很明显,当函数表达式具有名称(技术上称为标识符)时,它称为命名函数表达式。您在第一个示例中看到的内容– var bar = function foo(){}; —就是那个—命名函数表达式,其中foo是函数名称。要记住的一个重要细节是,该名称仅 在新定义的函数范围内可用;specs规定标识符不能用于封闭范围。阅读本文的更多详细信息。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript