考虑以下函数定义表达式(FDE):
var square = function name(x) {
return x*x;
}
当我输入"名称"在控制台上 - 我得到空字符串。
name;
""
当我输入方形时,会按原样打印该功能。 - 足够公平
square;
function name(){ console.log('hi');}
我得到了这个 - square是一个变量,它打印字符串文字
但是"名称" ? - 名称仅在函数体内有效,因为它是函数定义表达式的一部分。
"名称"控制台上的值是空白的 - 这是为什么?由于它是FDE的一部分,引擎会忽略功能代码块之外的任何引用?这是正确的解释吗?
答案 0 :(得分:3)
您将获得一个空字符串,因为在全局范围name
中引用了窗口对象的name属性,该属性默认为空。
另请注意,分配给name
属性的任何值都将转换为字符串。即,如果您指定name= {}
,则分配给name的值将为"[object Object]"
,因为它是对象的字符串表示形式。
在函数表达式中使用函数名时,函数名仅在函数内可用。
var fn = function testme() {
snippet.log('inside typeof: ' + typeof testme)
snippet.log('inside value: ' + testme)
return 'some value'
}
fn();
snippet.log('--')
snippet.log('outside typeof: ' + typeof testme)
snippet.log('outside value(fn): ' + fn)

<!-- Provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
&#13;
答案 1 :(得分:1)
评估name
时,您实际上正在阅读window.name
,默认为空字符串。
这是因为VM查看整个范围链以查找命名变量,并且由于全局上下文==窗口,窗口的所有属性最终都被视为全局变量,并且您在name
上获得匹配(与位置相同)等)。
当您命名一个FunctionExpression时,该名称仅在 该函数中可用。
答案 2 :(得分:0)
请参阅以下代码。这就是你要找的东西。
var square = function name(x) {
return x*x;
}
document.getElementById('thename').innerHTML = square.name;
<div id='thename'></div>
答案 3 :(得分:0)
您的功能已在变量中分配,因此您可以通过VARIABLE_NAME.name
获取该功能。在您的情况下,它会在您输入square.name
时显示。
另一个是square是函数,如果你通过给出圆括号E.g square('myname');
来使用它,但是如果你只使用变量名,那么它会打印整个函数。