2014-12-04 193 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