为什么名称函数表达式在函数体之外不可用
Why a Name Function Expression not available outside function body
定义为
的命名函数表达式var ninja = function myNinja();
有一种我无法理解的行为
看一下下面的代码
var ninja = function myNinja() {
console.log(typeof myNinja) //prints 'function'
};
console.log(typeof myNinja) //prints 'undefined'
现在,myNinja
是一个命名函数,据我所知,javascript允许命名函数超出其自身函数的范围。
不,这个函数不是一个命名函数,它是一个函数表达式。
函数表达式可以有一个可选的名称。裁判:
function [name]([param1[, param2[, ..., paramN]]]) {
statements
}
来源:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/function
关于函数名:
<名称/strong>
函数名。可以省略,在哪种情况下函数是匿名的。
(我强调。)
命名函数有非常相似的语法,但它是一个声明,而不是表达式。
现在,
myNinja
是一个命名函数,据我所知,javascript允许命名函数超出其自身函数的范围。
只能在函数声明中使用。对于命名函数表达式来说,它是而不是。这就是规范中的定义。
所有的血色细节都在规格书中,最相关的是:
FunctionExpression中的标识符可以从FunctionExpression的 FunctionBody内部引用,以允许函数递归地调用自己。然而,与FunctionDeclaration不同的是,FunctionExpression中的标识符不能被引用,也不会影响包含FunctionExpression的作用域。
所以如果你把代码改成:
function myNinja() {
console.log(typeof myNinja) //prints 'function'
}
var ninja = myNinja;
console.log(typeof myNinja) //prints 'function' (now we're using a declaration)
…因为它使用了函数声明,所以myNinja
被添加到定义它的作用域中。(与所有声明一样,声明也是提升的;它不像表达式那样作为分步代码的一部分来处理。)
您的函数存储在变量ninja
中,因此您不能通过函数名称访问它,只能通过变量名称:
console.log(typeof ninja)
这与下面的函数声明不同,后者可以通过函数名访问:
function ninja(){
}
还有其他不同之处,如后者与前者不同,后者是"提升的"。
相关文章:
- 如何在 JavaScript 中获取函数体文本
- Javascript重新定义和覆盖现有的函数体
- 为什么可以'我们在函数体中为函数对象添加属性,就像在javascript中为对象文字添加属性一样
- 在运行时将代码插入函数体
- 从函数体参数中获取值
- 为什么错误显示为函数体之前缺少{
- 如何在jquery中使用函数体onload
- JS:正则表达式,用于查找函数体中的所有函数调用
- CoffeeScript::我不知道为什么在使用 ajax 时返回函数体
- 为什么函数变量(当登录控制台时)没有显示整个函数体
- 使用ajax从同一个javascript函数多次调用,对象在函数体和ajax成功回调之间的参数不相同
- SyntaxError:函数体之前缺少{
- document.write在函数体中
- 在ASP.NET中找不到函数体
- 我想从javascript的函数名和该函数体得到解析到一个单独的文件.我怎么用Java来做呢
- 在JavaScript中获取函数体
- Jquery语法错误,函数体后面缺少}
- 为什么全局变量隐藏在整个函数体中?
- 用于处理函数体中所有内容的回调模式
- 语法错误:jquery函数体后缺少}