Scope testing

Testing variable scopes and sharing scopes between obects/functions

by SmokeyPHP

HTML

<pre id="console"></pre>

CSS

#console {
    width: 90%;
    margin: 0 auto;
    border: 2px dotted #CCC;
    background: #444;
    color: #EFEFEF;
    padding: 5px;
}

JavaScript

(function() {
    var objCount = function(obj) {
        var c = 0;
        for(var i in obj)
        {
            if(obj.hasOwnProperty(i)) c++;
        }
        return c;
    }
    var FuncBuilder = {
        build: function(name,func) {
            return new FuncBuilder._build(name,func);
        }
        ,_build: function(func,name) {
            this.name = name || 'unnamed function';
            this.func = func;
            this.vars = {};
            this.setVar = function(varname,myvar) {
                this.vars[varname] = myvar;
            }
            this.shareVar = function(varname,myvar) {
                this.vars[varname] = myvar;
            }
            this.shareVars = function(vars) {
                for(var i in vars)
                {
                    if(vars.hasOwnProperty(i))
                    {
                        this.vars[i] = vars[i];
                    }
                }
            }
            var self = this;
            this.exec = function() {
                pageConsole.log('calling "'+this.name+'"');
                if(objCount(this.vars) > 0)
                {
                    var funcStr = this.func.toString();
                    var args = funcStr.match(/\(([^)}]*)\)/)[1];
                    funcStr = funcStr.substr(funcStr.indexOf('{')+1).replace(/\}.*$/,'');
                    var evStr = 'var newFunc = new Function("'+args.replace(/,/g,'"')+'",';
                    var passArgs = [];
                    for(var i in arguments)
                    {
                        passArgs.push(arguments[i]);
                    }
                    for(var i in this.vars)
                    {
                        if(this.vars.hasOwnProperty(i))
                        {
                            passArgs.push(this.vars[i]);
                            evStr += '"'+i+'",';
                        }
                    }
                    evStr +=...