dvlsg
dvlsg

Reputation: 5538

Javascript function closures and access to parent scope

I have a question about whether or not what I'm attempting is possible in Javascript in regards to closures and parent scopes. Here's my code:

var func1 = function() {
    // console.log(this.source1);   // wont work, makes sense
    // console.log(source1);        // wont work, wish it would
    console.log(this.source2);      // works fine
    console.log(source2);           // works fine
};
var func2 = function() {
    var source1 = "source1";
    this.source2 = "source2";
    func1.call(this);
}();
var func3 = function() {
    var source3 = "source3";
    var func4 = function() {
        console.log(source3); // also works fine, makes sense
    }();
}();

Is there any way I can get access to variables declared with var on func2 inside func1, or am I out of luck?

Upvotes: 0

Views: 575

Answers (3)

Jeremy J Starcher
Jeremy J Starcher

Reputation: 23863

As others have said -- no.

But if you put this whole thing in a wrapper and use the Revealing Module Pattern, then you can.

var module = (function() {
    var source1;
    var source2;

    var func1 = function() {
        console.log(source2);           // works fine
    };
    var func2 = function() {
        source1 = "source1";
    }();
    var func3 = function() {
        var func4 = function() {
            console.log(source1); // also works fine, makes sense
        }();
    }();

    return {
      func1: func1,
      func2: func2,
      func3: func3
    };

}());

// Then invoke them.
module.func2();
module.func1();

EDIT

Then you can re-assign them back to the original names.

var func1 = module.func1;
var func2 = module.func2;
var func3 = module.func3;

Upvotes: 1

Molecular Man
Molecular Man

Reputation: 22386

The answer to your question is no.

The scope of the inner function is limited to its own scope and the scope of the outer function in which the inner function is declared (not called but declared).

console.log(this.source2); works fine cause both function have window as their context (window plays role of the outer function). this = window inside those functions.

Upvotes: 1

timetowonder
timetowonder

Reputation: 5421

Well, no, it won't work, and it shouldn't. Thankfully :) That's exactly how local variables are supposed to behave.

One thing you can do is pass the desired variable to the function func1 (and the function should expect it. Which is no problem — if you wish to somewhere call this function without passing a variable, Javascript would be totally okay with it)

Another thing is to declare the source1 variable without "var" keyword. Then it would work, but you really shouldn't do that unless you're keeping a very good track of your global variables.

Upvotes: 1

Related Questions