解释JavaScript:值赋值失败

3
var sc = new stuCore();
function stuCore() {
    this.readyPages = [];
    this.once = true;
    var self = this;

    // gets called asynchronously
    this.doPrepPage = function (page){

            if(self.once == true){
                   // still gets executed every time, assignment fails
                   self.once = false;
                   doSomeStuffOnce();
            }
    };

   this.addReadyPage = function (pageid) {

            console.log("readypage called");
            this.readyPages.push(pageid);
            if (!$.inArray(pageid, self.readyPages) != -1) {
                    this.doPrepPage(pageid);
            }
    };


}

为什么这个任务失败了?我以为我懂js的基础知识,但是我被这个难住了。另外,可能的解决方案是什么?首先调用构造函数并在那里设置变量吗? 编辑: 在其他脚本中像这样被调用:
  sc.addReadyPage(self.id);

1
// gets called asynchronously 你是如何异步调用它的?你是如何调用 stuCore 的?对我来说它运行良好:http://jsfiddle.net/fkling/KwRKf/ - Felix Kling
你在哪里检查self.once的值?这个函数被执行了多次吗? - CKKiller
你尝试使用调试器了吗?当你将它分配给self时,this此刻是什么? - Bruno Schäpper
提供更多上下文:这个值取决于你从哪里调用这段代码(或者你是否使用带有“new”运算符的构造函数语法)。如果你从两个不同的上下文中调用stuCore(),doSomeStuffOnce()将被调用两次... - tucuxi
1
抱歉,但您发布的代码并没有您所描述的问题...请看我的演示。或者您的描述不是很准确。您将能够为每个实例至少调用一次doPrepPage。要么您自己提供一个显示问题的示例,要么我们无法帮助您。 - Felix Kling
@tucuxi,您能详细说明一下吗:您所说的两个不同的上下文是什么意思?我正在使用带有new语法的构造函数——没有stuCore构造函数。@Felix感谢您提供的jsfiddle示例,我再次查看了代码,但是我找不到可能会产生影响的实例或函数。 - jcfrei
2个回答

1

jQuery.inArray函数将返回包含给定值的数组中的索引。在检查self.readyPages中是否存在pageid之前,您的脚本将pageid推入this.readyPagesthis.readyPagesself.readyPages是同一个数组引用,因此结果始终为零或更大,因此调用doPrepPage的条件永远不会运行。

您可以尝试交换它们的顺序:

this.addReadyPage = function (pageid) {
        console.log("readypage called");
        if ($.inArray(pageid, self.readyPages) != -1) {
                this.readyPages.push(pageid);
                this.doPrepPage(pageid);
        }
};

(编辑:已删除额外的!,感谢@chumkiu)

0

如果我理解正确,你在调用this.doPrepPage时的语法是<insert variable name here>.doPrepPage

如果是这样的话,那么你的var self会被传递到匿名函数中并被保存,所以每次调用this.doPrepPage时都会使用本地变量self

试着将self设置为全局变量,这样它将永久修改self,每次调用this.doPrepPage时都使用更新后的变量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接