2014-12-04 195 views
-1

这是jsfiddle。 代码:如何从全局范围调用jQuery范围内的函数?

$(function(){ 
    f1();//OK 
    f2();//OK 
    function f1(){ 
     console.log("1"); 
    } 
}); 

function f2(){ 
    console.log("2"); 
} 

f2();//OK 
f1();//NO!!! 

正如你所看到的,F1()不是从全球范围(或外部jQuery的范围)执行。有人能告诉我为什么吗?

+0

'f1'不在范围内。 – Mathletics 2014-12-04 04:23:25

+0

@Mathletics是的,我知道。我问了如何从全局范围的jQuery范围调用f1()。 – nich 2014-12-04 06:05:42

回答

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

+0

我很久以前就知道关闭了,但还没有使用它。这是一个很好的例子,thx! – nich 2014-12-04 06:21:07

+0

@nich用更有趣的例子更新了答案。关闭通常用于js中以保护变量并限制修改它们的方法。 – Leo 2014-12-04 06:33:26

+0

干得好,thx男人! – nich 2014-12-04 10:19:09

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