Javascript函数,如;var foo=功能栏()…“;?

Javascript函数,如;var foo=功能栏()…“;?,javascript,function,Javascript,Function,代码是这样的(语法可能看起来很奇怪,但据我所知,它没有任何问题。或者是有问题吗?) addNums()被声明为函数。因此,当我将参数传递给它时,它也应该返回结果 那么,为什么我没有收到第二个警报框?addNums不是全局命名空间中的函数。。 它是仅在赋值运算符中定义的函数 如果您想访问它,请尝试以下操作: function addNums(a, b) { return a+b; } var add = addNums;

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

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


那么,为什么我没有收到第二个警报框?

addNums不是全局命名空间中的函数。。 它是仅在赋值运算符中定义的函数

如果您想访问它,请尝试以下操作:

  function addNums(a, b) 
  {                     
     return a+b;
  } 

  var add = addNums;


  var add = function <---- the function name is add and it's value is a function..            
函数addNums(a,b)
{                     
返回a+b;
} 
var add=addNums;

var add=function您应该声明为命名函数:

function addNums(){

}
function addNums(a, b) {
    return a + b;
}

var add = addNums;
var f = function factorial(x) {
    if (x <= 1) return 1;

    // here we want to use the function itself
    return x * factorial(x - 1);
};

console.log(f(5));
或将函数赋值给变量:

var add= function(){// your code }
addNum()不返回任何内容的原因是,它没有按您声明的方式添加到全局作用域中。


addNums
仅在新定义的函数范围内可用

很明显,当函数表达式有名称时(从技术上讲- 标识符),称为命名函数表达式。你做了什么 在第一个示例中可以看到-var bar=function foo(){};-是 确切地说,这是一个命名函数表达式,foo是一个函数 名称需要记住的一个重要细节是,此名称仅为 在新定义的功能范围内可用;规范要求 标识符不应可用于封闭范围

阅读有关问题的更多详细信息 您正在使用-并且函数表达式的名称在该函数的作用域之外不可用:

// 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(){
    
    }
    
    function addNums(a, b) {
        return a + b;
    }
    
    var add = addNums;
    
    var f = function factorial(x) {
        if (x <= 1) return 1;
    
        // here we want to use the function itself
        return x * factorial(x - 1);
    };
    
    console.log(f(5));
    
  • 将这两个名称别名到表达式:

    var add = addNums = function addNums(a, b) {
        return a + b;
    };
    
为什么JavaScript会这样做? 命名函数表达式很有用,因为它们允许您在函数本身内部引用函数,并为您提供一个名称,以便在调试器中查看。但是,当您将函数用作值时,通常不希望函数的某些部分泄漏到封闭范围中。考虑:

(function setup() {
    var config = retrieveInPageConfig();
    if (config.someSetting) {
        performSomeOtherSetup();
    }
    kickOffApplication();
})();
这是函数表达式的完全合法使用-在这种情况下,您不会期望名称
setup
泄漏到封闭范围中。将命名函数表达式赋给变量只是这种情况的一种特例,它恰好看起来像一个函数语句声明。

您将看到一个新的函数表达式

匿名函数表达式是指将没有名称的函数分配给变量1:

命名函数表达式是将命名函数指定给变量的表达式(令人惊讶!)

函数名仅在函数本身中可用。这使您能够使用递归,而不必知道函数的“外部名称”——甚至不必首先设置一个(想想回调函数)

您选择的名称会隐藏现有名称,因此如果在其他位置定义了另一个
addNums
,则不会覆盖该名称。这意味着您可以使用任何您喜欢的名称,而无需担心范围界定问题或破坏任何内容

在过去,您可能会在不知道函数名称的情况下引用其内部的函数。但是JavaScript2已经不再支持这一点,所以NFE现在是实现这一点的正确方法

关于这个话题,这里有很多东西要读:


1没有必要将其分配给变量,它只是作为一个示例,将其与普通函数声明区分开来。它可以是JS需要表达式的任何其他上下文(例如,函数参数)


2如果有效并尝试使用
参数,您将收到一个错误。被调用方

我已在我的测试web应用程序中添加了您的代码,对我来说效果很好。这是代码。请分享您的代码/应用程序的更多详细信息,好吗

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="JavascriptTest.aspx.cs" Inherits="GetGridViewColumnValue.JavascriptTest" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>

    <script type="text/javascript">
        var add = function addNums(a, b) {
            return a + b;
        }
        alert("add: " + add(2, 3));           // produces 5
        alert("addNums: " + addNums(2, 3));

     </script>

</head>
<body>
    <form id="form1" runat="server">
    <div>

    </div>
    </form>
</body>
</html>

var add=函数addNums(a,b){
返回a+b;
}
警告(“添加:+add(2,3));//产生5
警报(“addNums:+addNums(2,3));

干杯

考虑以下代码:

var f = function g() {
    // function
};
g
将仅在功能本身中访问,并且在您想要使用该功能时需要访问 本身,用于编写递归函数。例如,您需要
factorial
函数:

function addNums(){

}
function addNums(a, b) {
    return a + b;
}

var add = addNums;
var f = function factorial(x) {
    if (x <= 1) return 1;

    // here we want to use the function itself
    return x * factorial(x - 1);
};

console.log(f(5));

我稍微修改了您的代码:

var add = function addNums(a, b){
             return a+b;
}
console.log(add);
console.log(typeof(add));
console.log("add: "+ add(2,3));           // produces 5
console.log("addNums: "+addNums(2,3));
然后在node.js中运行它以获得以下输出:

[Function: addNums]
function
add: 5

/home/mel/l.js:44
console.log("addNums: "+addNums(2,3));
                        ^
ReferenceError: addNums is not defined (... backtrace)
通常,当使用
console.log(var)调用时,分配给内联匿名方法的变量将打印出
[Function]
Here
console.log(添加)将导致同时打印的函数名称


因此,您的addNums声明不是无效的或未使用的,它只是限定了绑定到变量add的范围

在我看来,这不像是有效的javascript。@Matthew,以何种方式?可能是因为addNums()是在运行时定义的,而不是在解析时定义的,并且在其作用域之外不可见。请参见@c 2。我认为这种声明也没有任何问题。这段代码是否正常工作?嗯,对我来说不是,对这里的其他人来说也是+1解释使用命名函数表达式的原因和位置。@Tomalak您的回答帮助很大。谢谢你的链接:)