这是jsfiddle。 代码:
$(function(){
f1();//OK
f2();//OK
function f1(){
console.log("1");
}
});
function f2(){
console.log("2");
}
f2();//OK
f1();//NO!!!
如您所见,f1()不是从globe范围(或jquery范围外)执行的。有人可以告诉我为什么吗?
答案 0 :(得分:3)
在其他函数中声明的函数仅在声明它们的函数中可用。在这方面,它们就像局部变量。它们是声明它们的范围的私有,并且无法从外部访问它们。
如果您希望它在更高的范围内可用,则在更高的范围内声明该函数或将其分配到更高的范围,然后您可以从两个位置调用它。
$(function(){
f1();//OK
f2();//OK
});
function f1(){
console.log("1");
}
function f2(){
console.log("2");
}
f2();//OK
f1();//OK
也可以这样做(手动将函数分配到全局范围):
$(function(){
// assign function into the top level scope
window.f1 = function(){
console.log("1");
}
f1();//OK
f2();//OK
});
function f2(){
console.log("2");
}
f2();//OK
f1();//OK - only after document is ready and window.f1 has been assigned
答案 1 :(得分:1)
这就是所谓的closure!
JS函数有自己的作用域:函数内部定义的变量不能在其外部访问。如果您想这样做,您必须从外部范围引用它。
var globarF1;
$(function(){
f1();//OK
f2();//OK
function f1(){
console.log("1");
}
globarF1 = f1;
});
globarF1();// now it's ok
这是一个更有趣的例子:
function outer() {
var asdf = 1;
return function() {
return asdf;
}
}
asdf; // Error: asdf is not defined
var qwer = outer();
qwer(); // 1
请注意outer()
只返回一个amounymous函数,qwer()
实际执行amounymous函数,这是闭包的强大功能:函数outer
的执行范围不是即使它已经返回也被销毁,因为从外部引用了它的局部变量,你可以通过这种方式访问其中的变量asdf
。