2014-01-30 220 views
6

我想弄清楚如何從外部函數中獲取變量,在jQuery中的函數內,但我得到Uncaught ReferenceError: myvar is not defined。有沒有辦法做到這一點?如何從jQuery中的函數內部獲取外部變量?

我的代碼一個簡單的例子:

$(function(){ 
    var myvar = "stackoverflow"; 
}); 

$(function(){ 
    alert(myvar); 
}); 

但是,當我定義函數外部變量它的工作原理:

var myvar = "stackoverflow"; 

$(function(){ 
    alert(myvar); 
}); 

爲什麼?

任何幫助表示讚賞!謝謝!

+1

多數民衆贊成在工作的方式。閱讀http:// stackoverflow。com/questions/500431/javascript-variable-scope – Sarath

+0

是的,閱讀JS範圍。 – enguerranws

+0

函數創建範圍。用'var'聲明的變量是* local *,並且不能在其外部訪問。該變量甚至只存在於代碼運行的時刻(假設沒有關閉)。 –

回答

8

第二個示例的原因是因爲您將myvar定義爲全局變量(可從任何地方訪問)。

因爲變量功能範圍內所定義的第一示例不起作用(這意味着它是不可訪問的所有不同的是功能的範圍,和該父功能的範圍內定義的函數的範圍)。

正如評論中所述,這只是JavaScript的工作原理。如果這是您遇到的問題,那麼現在可能是重新考慮您的架構的時候了。

一種常見模式是定義共享變量作爲父對象或函數的屬性。例如:

$(function() { 
    var funcOne = function() { 
     this.sharedVal = 'stack overflow'; 
    }; 
    var funcTwo = function() { 
     console.log(funcOne.sharedVal); 
    }; 
}); 

這樣你可以有不同的功能,這些功能能夠在其他函數中其他內分享他們的性能,同時也保持了全局命名空間的清潔。但是請注意,在這個例子中,一個簡單的var x = 'something';未綁定爲另一個函數的屬性會做一樣好。

+0

非常感謝你的好解釋。 :) –

+0

不客氣:D – monners

3

這是由於變量的範圍。 (函數()在$定義的變量有這個函數內部的範圍。這裏的enclusre descide範圍。外函數定義的變量具有全局範圍和窗口對象定義。

範圍內的功能。

$(function(){ 
    var myvar = "stackoverflow"; 
}); 
// myvar is not accessible here. 

範圍窗口對象內。

$(function(){ 
    window.myvar = "stackoverflow"; 
}); 

// myvar is accessible here. 
6

它的所有作用域,在你的第二個例子myvar可以在全球範圍內,而在第一個它在功能包含。

您可以強制它是全球性的,但:

$(function(){ 
    window.myvar = "stackoverflow"; 
}); 

$(function(){ 
    alert(myvar); 
}); 

(假設這是在瀏覽器中)

+1

應該注意的是,這是一種*可怕的做法......據說,據我所知,這是實現OP所要求的唯一方法,所以+1。 – monners

+0

:)當然,從來沒有這樣做,但它可能的 –

1

在聲明裏面的功能。它有它的範圍僅限於該函數的變量(如果你的場景之一)。

要在函數外部訪問它們,您需要將其聲明爲全局變量。這是第二種情況。

相關問題