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]
Hereconsole.log(添加)代码>将导致同时打印的函数名称
因此,您的addNums声明不是无效的或未使用的,它只是限定了绑定到变量add的范围 在我看来,这不像是有效的javascript。@Matthew,以何种方式?可能是因为addNums()是在运行时定义的,而不是在解析时定义的,并且在其作用域之外不可见。请参见@c 2。我认为这种声明也没有任何问题。这段代码是否正常工作?嗯,对我来说不是,对这里的其他人来说也是+1解释使用命名函数表达式的原因和位置。@Tomalak您的回答帮助很大。谢谢你的链接:)