[英]Is it possible to use non-global variables in function?
我真的很滿意這一點,並沒有找到一個真正解釋得很好的答案......
我知道如何從函數中訪問全局變量。
myGlobalVariable = [];
function myFunction() {
myGlobalVariable.push("somedata");
}
現在,如果它不是全局的,我如何在范圍鏈上一步訪問變量?
myGlobalVariable = [];
function myFunction() {
var notGlobalVariable = "somedata";
var myOtherFunction = function() {
myGlobalVariable.push(notGlobalVariable); // This is what I'd like to be able to do.
}
}
我知道我可以做點什么
var notGlobalVariable = "somedata";
var myOtherFunction = function(arg) {
myGlobalVariable.push(arg);
}
myOtherFunction(notGlobalVariable);
但是只有當notGlobalVariable
的值可用時,調用該方式才有效。 我希望能夠全局調用該函數,並始終使用notGlobalVariable
最初持有的值,而不必傳遞該值。
編輯
好吧,我有點跳過這一槍。 我雖然有一個很大的變量范圍問題,但顯然我的問題是在我的特定代碼中我使用變量名稱arguments
代替notGlobalVariable
,並且我應該知道, arguments
被遮蔽並且引用傳入的參數我將名稱更改為args
並且工作正常。 抱歉!
JavaScript通過創建閉包自動完成。
這里
var myGlobalVariable = [];
// define function => creates closure #1
function myFunction() {
var notGlobalVariable = "somedata";
// define function => creates closure #2
var myOtherFunction = function() {
myGlobalVariable.push(notGlobalVariable);
}
// execute function
myOtherFunction();
}
myFunction(); // myGlobalVariable will be ["somedata"]
你創建了兩個范圍:
myFunction
可以看到myGlobalVariable
myOtherFunction
的匿名函數可以看到myGlobalVariable
和notGlobalVariable
。 現在假設一個小小的變化:
var myGlobalVariable = [];
// define function => creates closure #1
function myFunction(callback) {
var notGlobalVariable = "somedata";
// define function => creates closure #2
var myOtherFunction = function() {
myGlobalVariable.push(callback());
}
// execute function
myOtherFunction();
}
// define function => creates closure #3
function foo() {
var thisIsPrivate = "really";
// define function => creates closure #4
return function () {
return thisIsPrivate;
}
}
myFunction(foo()); // myGlobalVariable will be ["really"]
您會看到callback
函數可以訪問thisIsPrivate
因為它是在正確的范圍內定義的,即使它執行的范圍無法看到變量。
同樣, callback
函數將無法看到notGlobalVariable
,即使該變量在執行回調的作用域中可見。
請注意,您始終必須對您定義的任何變量使用var
。 否則變量將是靜默全局的,這可能並且將導致難以修復程序中的錯誤。
是的,你可以 - 在javascript中一切皆有可能 - 這里是小提琴http://jsfiddle.net/AZ2Rv/
myGlobalVariable = [];
function myFunction() {
var notGlobalVariable = "somedata";
// The following assigns a function to a variable
var myOtherFunction = function() {
myGlobalVariable.push(notGlobalVariable);
}
// The following line was missing in the code in the question so the function
// was never called and `notGlobalVariable` wasn't pushed into `myGlobalVariable`
myOtherFunction();
}
// And just to test if it works as expected
myFunction();
alert(myGlobalVariable[0]);
OP的問題實際上是在他沒有發布的代碼中實現的,但是這個示例代碼回答了原始問題 - 閉包仍然按照預期在javascript中工作。
您可以訪問notGlobalVariable
內的myOtherFunction
。 但是,您只是分配myOtherFunction
並且從不調用它。 請注意,您必須在myFunction
調用myOtherFunction
。
function myFunction() {
var notGlobalVariable = "somedata";
var myOtherFunction = function() {
myGlobalVariable.push(notGlobalVariable); // This is what I'd like to be able to do.
}
//Invoke myOtherFunction()
myOtherFunction()
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.