匿名函数内部的Javascript范围问题
Javascript scope issue, inside an anonymous function
对不起,我不能再具体说明标题了。
我正在构建一个网站(个人),它根据url中使用的查询字符串向用户显示不同的内容。
例如page=home.html
将显示home.html
网站Javascript被包裹在一个对象中,每个值都包含不同的数据,一些伪代码:
(function(){
var wrapper = {
init: function(){
//Runs on document ready
this.foo();
this.nav.render();
},
foo: function(){
//Some functionality goes here for the website, e.g. Display something from an API
},
nav: {
//Functionality to handle the navigation, has different properties
config: {
//Contains the config for nav, e.g. page names + locations
dir: '/directory/to/content/',
pages: {
page_name: wrapper.nav.config.dir + 'page_value'
}
},
render: function(){
//some code
},
routes: function(){
//some code}
}
}
};
$(function(){
wrapper.init();
});
})();
我的问题是,我试图将dir
值预先设置为每个page
值(在定义页面的对象内),希望获得directory/to/content/page_value
的输出(在这种伪代码的情况下),但当我试图访问dir
时,它是未定义的,我尝试了以下方法来实现我想要的:
- wrapper.nav.config.dir+"页面值"
在过去的30分钟里,我一直在努力找出我做错了什么,甚至想过为每个页面硬编码URL。
之所以要这样做,是因为我的本地开发服务器和web主机有不同的目录结构,所以我不想每次开发+发布时都重写URL。至于为什么所有东西都被包裹在一个物体里,我认为这样维护会更容易。
希望答案很简单,这只是一个业余的错误/缺乏理解。
问题是不能引用在该定义中定义的变量。
因此,在wrapper
的定义中,不能引用wrapper
。而且,在config
的定义中,也不能引用config
,依此类推
解决此问题的通常设计模式是在数据结构的声明中尽可能多地初始化,然后在.init()
中完成其余操作,此时您可以自由访问所有数据结构。
将前两行更改为:
var wrapper = null;
(function(){
wrapper = {
否则,包装器就是匿名函数的局部变量。
问题是,当您询问包装器的值时,您仍然忙于定义包装器,这就是为什么它仍然未定义的原因。
下面的代码也失败了:
var x = {
y:"1",
z:x.y
}
为什么不:
//...
init: function(){
//Runs on document ready
this.foo();
var config = this.nav.config;
for (var page in config.pages) {
config.pages[page] = config.dir + config.pages[page];
}
},
//...
相关文章:
- 获取给定JavaScript范围内的解析函数
- 生成时间戳日期|Javascript范围内的空数据
- 注入函数中的 JavaScript 范围
- 可能存在Javascript范围问题
- JavaScript范围说明
- 如何获取整个 JavaScript 范围内上次单击的事件数据
- 下面的 JavaScript 范围是如何工作的
- 关于 JavaScript 范围的澄清
- JavaScript 范围和执行上下文
- Javascript 范围和此关键字的使用
- 变量和框架的 JavaScript 范围
- 使用此标识符的函数的 JavaScript 范围规则
- Javascript 范围:为什么 foo 返回未定义
- Javascript - 范围问题 - 有很好的Javascript答案
- JavaScript 范围和全局变量
- Javascript范围在角度SPA应用程序中不起作用
- KineticJS - 基本的JavaScript范围问题
- 我的JavaScript范围有什么问题
- 尝试块中的 JavaScript 范围
- JavaScript 范围/代码迭代不同步