簡體   English   中英

在Javascript中,如何從該函數中調用但在其他位置定義的函數中引用函數范圍的變量?

[英]In Javascript, how can I reference a function-scoped variable from a function called within that function but defined elsewhere?

我有一個類似這樣的Javascript函數,它在無法更改的地方定義:

foo.customSave = [];

foo.save = function() {
    var saveString = 'initial value';
    // stuff about saveString here
    for (i in foo.customSave) { foo.customSave[i](); }
    // more stuff about saveString here, including actually saving it
};

然后我有自己的代碼,如下所示:

bar.init = function() {
    // other init stuff here
    foo.customSave.push(function() {
        saveString += 'something meaningful here';
    });
    // more other init stuff here
};

bar.init()被調用在適當的時間(這就是說,前foo.save()被調用)。 問題似乎是當我嘗試向其中添加'something meaningful here'時未定義saveString (將console.log調用放在'something meaningful here'即可確認這一點)。

我的customSave函數可以以任何方式訪問該字符串,還是卡住了?

鑒於您無法修改與foo.save關聯的函數,因此無法修改saveString變量。 這是因為saveString是局部變量,其作用域是與foo.save關聯的foo.save 結果,您可以調用該函數,但是它基本上就像一個黑匣子,在其中您無法訪問在其中定義的變量(實際上,如果不查看源代碼,您甚至不會知道saveString變量存在)。

在與相關的功能bar.init ,你要創建一個新的函數對象每次bar.init被調用,它推到一個數組。 並且因為您沒有使用var來聲明saveString變量,所以JavaScript會嘗試在要推送到數組的函數中找到saveString變量。 由於在此處找不到聲明,因此JavaScript將繼續在下一個外部范圍中bar.initbar.init關聯的函數中的bar.init 由於也無法在其中找到JavaScript,因此JavaScript會最后嘗試在全局范圍內找到它(也不會在其中獲得成功)。

希望能有所幫助,但總而言之,不能修改foo.save ,您會陷入困境。

如何將saveString添加為foo的屬性?

像這樣:

foo.customSave = [];

foo.saveString = '';

foo.save = function() {
    foo.saveString = 'initial value';
    // stuff about saveString here
    for (i in foo.customSave) { foo.customSave[i](); }
    // more stuff about saveString here, including actually saving it
};

然后:

bar.init = function() {
    // other init stuff here
    foo.customSave.push(function() {
        foo.saveString += 'something meaningful here';
    });
    // more other init stuff here
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM