JavaScript和对象访问

JavaScript和对象访问,javascript,jquery,ajax,json,object,Javascript,Jquery,Ajax,Json,Object,我把这段基本的JavaScript代码作为一个迷你文件管理器项目的一部分,我只是为了好玩,但不幸的是它不起作用。在get()函数中,我试图访问Content.files数组,但由于函数中的变量范围或其他原因,它没有正确设置数组,页面上没有显示任何内容。Firefox的错误控制台什么也没给我。我该如何解决这个问题 顺便说一句,最近我一直在关注C#和PHP,如果这只是一个愚蠢的语法错误,请原谅我。谢谢 <script type="text/javascript"> Page = {

我把这段基本的JavaScript代码作为一个迷你文件管理器项目的一部分,我只是为了好玩,但不幸的是它不起作用。在
get()
函数中,我试图访问
Content.files
数组,但由于函数中的变量范围或其他原因,它没有正确设置数组,页面上没有显示任何内容。Firefox的错误控制台什么也没给我。我该如何解决这个问题

顺便说一句,最近我一直在关注C#和PHP,如果这只是一个愚蠢的语法错误,请原谅我。谢谢

<script type="text/javascript">

Page = {

currentdir: '/',
}

Content = {

files:[], folders:[],

get: function() {

    $.post('?p=myfiles&ajax', {
        dir: '/',
    }, function (data) {
        Content.files = data.files;
        Content.folders = data.folders;
    }, "json"); 
},

build: function () {

    for (var n = 0; n < Content.files.length; n++) {

        var id = Content.files[n].id;
        var name = Content.files[n].name;
        var size = Content.files[n].size;

        output = '<td>File</td><td>'+id+'</td><td><a href="?p=file-download&id='+id+'">'+name+'</a></td><td>'+((size / (1024*1024)).toFixed(2))+' MB</td>';

        $('#filetable').append('<tr>'+output+'</tr>');

    }
},

}

</script>

第页={
currentdir:“/”,
}
内容={
文件:[],文件夹:[],
get:function(){
$.post(“?p=myfiles&ajax”{
目录:“/”,
},函数(数据){
Content.files=data.files;
Content.folders=data.folders;
}“json”);
},
构建:函数(){
对于(var n=0;n
您将希望在对象内部使用
this.files
而不是
Content.files
<代码>内容是您对正在创建的对象的引用。也许你可以像现在这样关闭它的值,我真的不知道,但它闻起来很难闻,这就是隐式
这个
变量的真正用途。在对象外部,一旦将其分配给变量
Content
,则可以说
Content.files
来引用该成员变量


作为旁注,最好将脚本封装在一个立即调用的匿名函数中,以免与
窗口
对象的其他成员发生冲突,如果不使用
var
声明变量或在函数范围外创建变量(两者都在做),则可能会发生冲突。我会仔细阅读以更好地理解这一点。

内容
尚未定义,因为您实际上正在定义它,但在对象范围中,您可以使用
this
引用它。post回调有自己的作用域,但您可以在更高的作用域中重新分配
this

get: function() {
    var self = this;
    $.post('?p=myfiles&ajax', {
        dir: '/',
    }, function (data) {
        self.files = data.files;
        self.folders = data.folders;


还需要注意的是,您不知道
$.post
方法何时会完成运行,因此对
内容的任何依赖都必须依赖于请求的完成。

以及您删除的注释(我猜是因为我错误地删除了自己的注释),在调用
get
之后,立即调用
build
方法。不幸的是,
get
发出了一个异步的AJAX请求。这意味着,Javascript在运行进一步的代码之前不会等待AJAX响应,因此在发送请求后立即运行
build
。响应将在将来的某个时候返回(从现在开始不久),但几乎肯定不会在调用
build
之前返回。这意味着这些项目将不会被填充。下面是一个如何提供回调的示例:

var Page = {   // <-- Add `var`
    currentdir: '/',
};

var Content = {   // <-- Add `var`
    files:[],
    folders:[],
    get: function (callback) {
        $.post('?p=myfiles&ajax', {
            dir: '/',
        }, function (data) {
            Content.files = data.files;
            Content.folders = data.folders;
            //if (typeof callback !== "undefined") { // <-- Might be better than below, in the special cases where some functions are "objects" in IE
            if (typeof callback === "function") {
                Function.prototype.apply.call(this, callback, arguments);
            }
        }, "json");
    },
    build: function () {
        for (var n = 0; n < Content.files.length; n++) {
            var id = Content.files[n].id;
            var name = Content.files[n].name;
            var size = Content.files[n].size;
            output = '<td>File</td><td>'+id+'</td><td><a href="?p=file-download&id='+id+'">'+name+'</a></td><td>'+((size / (1024*1024)).toFixed(2))+' MB</td>';
            $('#filetable').append('<tr>'+output+'</tr>');
        }
    }    // <-------------- Remove the comma
};

Content.get(Content.build);

var Page={//到底是什么问题?Content.files变量从未设置过,因此稍后在build()函数中访问它不会产生任何结果。您必须调用
Content.build()在
$.post
的回调内部,因为
$.post
是异步的。
build
在示例注释中的
get
之后立即执行,但是
get
发送的AJAX请求在调用
build
之前不会返回结果,因为它是异步的!谢谢成功了,我只是为get()添加了一个方法重载,询问它是否在ajax请求后运行build()。@user1653653没问题!我添加了一个答案来全面解释,并附带了一些额外的细节