优先定义,使用滞后
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 协议》,转载必须注明作者和本文链接