var f = function g() {
return 23;
};
g() // ReferenceError: g is not defined
如果你希望打印g这个函数,可以这么搞:
var f = function g() {
console.log(g);
//function g() {
// console.log(g);
// console.log(typeof g);
// return 23;
//}
console.log(typeof g); // function
return 23;
};
f(); // 23
再举个例子:
var outer = function(){
function inner(){
console.log('inner');
};
console.log('outer');
}
outer(); // outer
inner(); // ReferenceError: inner is not defined
你有个地方误解了:
在你将这个函数赋值给变量f后:
g这个函数其实被封存在了f里,外界是访问不到的:
如果你希望打印g这个函数,可以这么搞:
再举个例子:
问题在与:
这是一个表达式,表示给变量f一个函数对象,这里并不会创建变量g
像这样的函数声明才会创建一个变量g
通过函数表达式的方式声明的函数,如果其带有函数名称,那么名称作用域只在其定义的函数内
这里面试题考查的命名函数表达式,函数名称的作用域问题的理解:
如果你想在函数体内部引用当前函数,则需要创建一个命名函数表达式。然后函数名称将会(且只会)作为函数体(作用域内)的本地变量。这样也可以避免使用非标准的 arguments.callee 属性。
function g() {
return 23;
};
typeof g();
var g = function () {
return 23;
};
上面两种形式一样,都是把函数赋给变量g,你所写的这种声明函数方式不存在。
函数声明和函数表达式的区别。