简体   繁体   中英

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

I have a Javascript function something like this, defined in a place I can't change it:

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
};

Then I have my own code like this:

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

bar.init() is called at an appropriate time (which is to say, before foo.save() is called). The problem seems to be that saveString is not defined when I try to add 'something meaningful here' to it (putting a console.log call there confirms this).

Is there any way my customSave function can access that string, or am I stuck?

Given that you can't modify the function associated with foo.save , there is no way you can modify the saveString variable. The reason for this is because saveString is a local variable that is scoped to function associated with foo.save . As a result, you can call the function, but it basically acts as a black box where you can't access the variables defined it in (in fact, without looking at the source code, you wouldn't even know that the saveString variable existed).

Within the function associated with bar.init , you're creating a new function object each time bar.init is called and pushing it to an array. And because you haven't used var to declare the saveString variable, JavaScript will try to find the saveString variable within the function being pushed to an array. Since it can't find the declaration there, JavaScript will continue looking up the variable in the next outer scope which the the function associated with bar.init . Since it can't find it there either, JavaScript will lastly try to find it in the global scope (and won't have success there either).

Hope that helps, but long story short, without being able to modify foo.save , you're stuck.

How about adding saveString as a property of foo ?

Like so:

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
};

Then:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM