为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

杨魅力 2019-12-05 15:20:26
代码是这样的(语法可能看起来很奇怪,但据我所知,它没有任何问题。还是存在?)var add=function addNums(a, b) {                        return a+b; }                      alert("add: "+ add(2,3));           // produces 5 alert("addNums: "+addNums(2,3));        // should also produce 5addNums()被声明为一个函数。因此,当我将参数传递给它时,它也应该返回结果。那么,为什么我没有得到第二个警告框?
查看完整描述

3 回答

?
蛊毒传说

TA贡献1895条经验 获得超3个赞

问题

您正在使用已命名的函数表达式 -函数表达式的名称在该函数范围之外不可用:


// Function statement

function 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 function

statement is a type of function

而:


// Function expression with a name

var expression = function namedExpression() {

    console.log("namedExpression is a type of " + typeof namedExpression);

};


expression();

// namedExpression();  // uncommenting this will cause an exception

console.log("expression is a type of " + typeof expression);

console.log("namedExpression is a type of " + typeof namedExpression);

将产生:


namedExpression is a type of function

expression is a type of function

namedExpression 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泄漏到封闭范围内。将命名函数表达式分配给变量只是这种情况的一种特殊情况,它恰好看起来像函数语句声明。


查看完整回答
反对 回复 2019-12-05
?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

addNums是只在新定义函数的范围内都有效。


很明显,当函数表达式具有名称(技术上称为标识符)时,它称为命名函数表达式。您在第一个示例中看到的内容– var bar = function foo(){}; —就是那个—命名函数表达式,其中foo是函数名称。要记住的一个重要细节是,该名称仅 在新定义的函数范围内可用;specs规定标识符不能用于封闭范围。


阅读本文的更多详细信息。


查看完整回答
反对 回复 2019-12-05
  • 3 回答
  • 0 关注
  • 452 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信