我将使用以下 JavaScript 代码来演示我正在尝试做的事情。
var App = function() {
var url
var width
var height
function init()
{
url = window.location.href
width = document.body.clientWidth
height = document.body.clientHeight
}
function run()
{
init()
alert(url + ' - ' + width + 'x' + height)
}
return {
run: run
}
}()
App.run()
(在以下位置运行此代码:http: //jsfiddle.net/zePq9/)
上面的代码实现了三件事:
- 避免使用全局变量和函数(
App
故意暴露给全局命名空间的全局对象除外)。 - 隐藏
url
,width
和height
变量以及init()
匿名函数中的函数。 - 仅公开
run()
匿名函数之外的函数。
但是,我不太喜欢这种方法,因为init()
andrun()
函数必须使用url
,width
和等变量height
。在更复杂和更大的 JavaScript 代码中,很难url
在函数中看到变量并知道它来自哪里。必须进行大量滚动才能回答以下问题:它是局部变量吗?是全局变量吗?它仅对匿名功能是本地的吗?
现在我正在用下面的代码解决这个问题。
var App = function() {
var self = {
url: '',
width: 0,
height: 0
}
function init()
{
self.url = window.location.href
self.width = document.body.clientWidth
self.height = document.body.clientHeight
}
function run()
{
init()
alert(self.url + ' - ' + self.width + 'x' + self.height)
}
return {
run: run
}
}()
App.run()
(在以下位置运行此代码:http: //jsfiddle.net/cXALf/)
现在,我可以清楚地看到self.url
并告诉这个变量来自self
对象,我知道的范围仅限于匿名函数,因为我的编码约定是使用self
对象将匿名函数中所有函数共享的变量保存在一起。请注意,self.url
它仍然隐藏在匿名函数中,并且在它之外不可见。
理想情况下,我想使用this.url
,this.width
等而不是self.url
,self.width
等。但我无法找到一个解决方案,使this.url
,this.width
等在匿名函数之外保持不可见。可能吗?