I want to do this because my project usually uses shortcut variables like the below:
(function() {
var world = new World(),
Event = world.Event,
Guide = world.Guide;
Event.add('updateUI', function() {
// 1st: Correct, the value of 'this' refers to a world
this.Guide.show('UI updated');
// 2nd: Ok because 'world' was defined in outer scope
world.Guide.show('UI updated');
// 3rd: Ok because 'Guide' was defined in outer scope
Guide.show('UI updated');
});
})();
If I move Event.add('updateUI', function() { ... }); to other file, only the first statement (this.Guide.show) works. How can I prevent this function from using the world or Guide variables of the outer scope so the second and third statements will throw errors from the beginning.
use strict is really close to this but it only prevent you from gaining access to the global object.
Updated to make this question clearer: The main question is: Are there any ways to prevent function from looking for variables in outer scopes? If there are no ways, please explain why because I think it's a reasonable need to do this.
You can use shadowing. If you explicitly declare the variable inside the function (and not initialize it), the function will use this variable instead of a variable of the same name from an outer scope.
Example:
var outer = 'foo';
function isolated () {
var outer;
console.log(outer);
};
isolated(); // output undefined
This should cover your needs.
There is another way, but it's an ugly hack and probably won't work on some browsers (IE ?).
Here is an example:
var outer = 'foo';
function isolated () {
console.log(outer);
};
var e = eval;
// will throw exception: 'outer' is not defined
console.log(e('('+isolated.toString()+')()'));
eval and e are not exactly the same. The 'true' eval has access to the whole scope, but if you copy it, then the javascript engines can optimize it by not making the outer scope available to the evaled code.
However: Don't do that !
eval should be avoided, it makes debugging a nightmare (you don't have access to a useful stack trace), there are performance and security issues, and you end up very quickly with an awful code to maintain.If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With