2014-03-12 54 views
0

的问题:我想遍历我的函数列表,并进行修改的地方,使用如下代码:性交的JavaScript模块范围

for(var funcProperty in scope) { 
    scope['_'+funcProperty] = scope[funcProperty]; 
    scope[funcProperty] = wrapFunctionInTryCatchBlock(scope['_'+funcProperty]); 
} 

我想这样做,但没有明确不必经过我所有的函数,并将它们添加到某个对象,从而创建所需的范围。我不想这样做,因为那么所有的功能,相互调用,必须有自己的名字修改,加长成为:

funcName成为scopeObject.funcName烦人。

我能做到这一点很容易,如果我的功能是在全局对象,即Window,但是我不想污染全局命名空间,所以我把它们放在一个模块中,像这样:

var MyModule = (function() { 
    function privateFunc1(...) {...} 
    function privateFunc2(...) {...} 

    var public_api = { 
     coolName : privateFunc1 
    }; 
    return public_api; 
}()); 

但是,我可以看到并发现无法访问立即执行的函数中存在的作用域对象,该对象的返回值分配给MyModule。

我试着这样做,从MyModule的范围内:

console.log(this)

,看看我们是否确实有访问范围,不知何故,但是,当然,事实证明,这被称为窗口。

我的问题是真的:什么是在MyModule的私人范围的方法分配到,因为它不是全局对象,而且它确实存在,因为所有的功能都有它隐含的准入范围对象。有没有什么办法可以让我作为一个JavaScript程序员可以明确地访问范围对象并枚举它的属性还是那个FORBIDDEN?

回答

0

我不会急于接受这个答案,但我发现一个可能解决方案,我很满意。

在这种情况下,“happy with”的定义是:最小的额外工作,几乎不改变现有的代码。

解决方案

我们修改模块代码如下所示:

// $ = wrapFunctionInTryCatchBlock 
function $(fun) { 
return function() { 
    try { 
     return fun.apply(this,arguments); 
    } catch(err) { 
     console.log("Error",err,err.stack); 
    } 
}; 
} 

var MyModule = (function() { 
    var privateFun1 = $(privateFun1(...){...}); 
    var privateFun2 = $(privateFun2(...){...}); 

    var public_api = { 
     coolName : privateFun1 
    }; 
    return public_api; 
}()); 

为什么这个工程

我们获得所需的代码修改(函数封装),基本到位因为分配给函数表达式的变量与原来的命名函数本身具有完全相同的范围。

Vim的正则表达式来帮助

我还创建了一个VIM正则表达式来解决这个问题,至少分配行反正:

s/function \(\w\+\)\(.\+\)$/var \1 = $(function \1\2/g