优先定义,使用滞后

优先定义,使用滞后

var f = function(){
    console.log('立即执行 f()');
    f.p = 'fp'; // 此f并非第一行的f,而是下方f
    function f(){
        console.log('执行 f()');
    }
    return f;
}();    //立即执行 f()
f();    //执行 f()
f.p;    // fp

(图 1)变量 f 是一个立即执行函数,内部又嵌套了一个同名函数 f ()。虽然 f.p 的赋值语句位于内嵌函数 f () 定义之前,但是在执行的时候赋值语句滞后于函数的定义。

var g = function(){
    console.log('立即执行 g()');
    function f(){
        console.log('执行 f()');
    }
    f.p = 'fp';
    return f;
}();    //立即执行 g()
g();    //执行 f()
g.p;    // fp

(图 2)将图 1 中的变量 f 改成 g,并将 f.p 的赋值语句写到内嵌函数的下方,这样就容易理解图 1 的写法了。

优先定义,使用滞后
图 3 正常,图 4 报错。尽管图 4 的变量 f 是一个立即执行函数,但是立即执行函数与函数并不是一回事。
修正方法 1:代码改成图 3 那样,f 不再立即执行,f 是全局函数。
修正方法 2:代码改成图 1 或图 2 那样(立即函数里面添加内嵌函数)。


简单一点,就是下面这样

var f = function(){
    f.p = 'fp'; // 非全局 f
    function f(){ }
}
f();
f.p;    // undefined
var f = function(){
    f.p = 'fp'; // 全局 f
    // function f(){ }
}
f();
f.p;    // fp
本作品采用《CC 协议》,转载必须注明作者和本文链接
未填写
文章
68
粉丝
17
喜欢
141
收藏
119
排名:130
访问:7.5 万
私信
所有博文
社区赞助商