function xyz(){
function abc(){};
// abc is defined here...
}
// ...but not here
其次,可以结合两种风格:
var xyz = function abc(){};
var xyz = function abc(){
// xyz is visible here
// abc is visible here
}
// xyz is visible here
// abc is undefined here
function abc(){};
var xyz = abc;
console.log(xyz === abc); // prints "true"
function abc(){};
console.log(abc.name); // prints "abc"
var abc = function(){};
console.log(abc.name); // prints ""
它的名字是空的 - 我们创建了一个匿名函数,并将其分配给一些变量。
使用合并风格的另一个好理由是使用一个简短的内部名称来引用自己,同时为外部用户提供一个长而不冲突的名称:
// Assume really.long.external.scoped is {}
really.long.external.scoped.name = function shortcut(n){
// Let it call itself recursively:
shortcut(n - 1);
// ...
// Let it pass itself as a callback:
someFunction(shortcut);
// ...
}
在上面的例子中,我们可以用外部名称做同样的事情,但它会太不多(而且更慢)。
function abc(){}
abc在这里在当前范围内在任何地方都被定义:
// We can call it here
abc(); // Works
// Yet, it is defined down there.
function abc(){}
// We can call it again
abc(); // Works
// We can call it here
abc(); // Works
return;
function abc(){}
这是一个功能表达:
var xyz = function(){};
xyz 在这里从分配点定义:
// We can't call it here
xyz(); // UNDEFINED!!!
// Now it is defined
xyz = function(){}
// We can call it here
xyz(); // works
函数声明与函数表达是格雷格所证明的差异的真正原因。
有趣的事实:
var xyz = function abc(){};
console.log(xyz.name); // Prints "abc"
var abc = function(){};
我知道我定义了函数本地,当我定义了函数如
abc = function(){};
function abc(){};
它取决于背景,可能会让你猜测它实际上在哪里定义,特别是在 eval()的情况下 - 答案是: 它取决于浏览器。