如何从全局范围调用jQuery范围内的函数?

时间:2014-12-04 03:22:17

标签: javascript jquery

这是jsfiddle。 代码:

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

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

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

如您所见,f1()不是从globe范围(或jquery范围外)执行的。有人可以告诉我为什么吗?

2 个答案:

答案 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