首页 > javascript函数表达式的一点问题。。。

javascript函数表达式的一点问题。。。

var f = function g() {
return 23;
};
typeof g();
为什么这里打印不了g这个函数


你有个地方误解了:

在你将这个函数赋值给变量f后:

function g() {
    return 23;
};

g这个函数其实被封存在了f里,外界是访问不到的:

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

函数声明和函数表达式的区别。


通过函数表达式的方式声明的函数,如果其带有函数名称,那么名称作用域只在其定义的函数内

var f = function g() {
    //能范围到g函数
    console.log(type of g);//function
    return 23;
};
console.log(type of g);//undefined

function g() {
return 23;
};
typeof g();

var g = function () {
return 23;
};
上面两种形式一样,都是把函数赋给变量g,你所写的这种声明函数方式不存在。


这里面试题考查的命名函数表达式,函数名称的作用域问题的理解:

命名函数表达式(Named function expression)

如果你想在函数体内部引用当前函数,则需要创建一个命名函数表达式。然后函数名称将会(且只会)作为函数体(作用域内)的本地变量。这样也可以避免使用非标准的 arguments.callee 属性。


问题在与:

var f = function g() { return 23; }

这是一个表达式,表示给变量f一个函数对象,这里并不会创建变量g

像这样的函数声明才会创建一个变量g

var f = g;

function g() { return 23; }
【热门文章】
【热门文章】