从函数

时间:2016-10-18 07:32:55

标签: javascript

我不确定我想做的事情是否可行,或者是否有更轻松的方法去做我想做的事情。

我有以下代码:

<script>
function TitleSwitch() {
    var counter = 0,
        fn = function () {
            var array = ['Value1','Value2','Value3'];
            $(document).prop('title', array[counter]);
            counter++;
            counter %= array.length;
        };
        fn();
    return fn;
}
setInterval(TitleSwitch(), 5000);
</script>

它每隔5秒在三个变量Value1,Value2和Value3之间旋转页面标题。这很好。

但是,在同一页面上有一些ajax脚本正在轮询与该应用程序相关的其他信息。

我要做的是使用轮询脚本返回的一些数据来更改标题切换功能中的值。

因此,作为示例,轮询数据可能会返回Value4,Value5和Value6。

所以在上面的代码中,有没有办法替换

中的值
var array = ['Value1','Value2','Value3'];

来自标题转换功能之外的其他功能?

所以,假设我有一个名为pollingDone()的函数,每次返回轮询数据时都会调用它,如何更改&#34; array&#34;在TitleSwitch()已经使用setInterval运行之后,在pollingDone()中的TitleSwitch()?

基本上,我试图做的是保持TitleSwitch运行,但只是替换使用的值。

我试图这样做的原因是因为标题每5秒在三个值之间切换,但是轮询脚本每10秒运行一次。因此,如果每次轮询脚本完成时都启动了TitleSwitch()函数,则第三个值将永远不会显示在标题中。前两个将显示,轮询脚本将运行,然后标题将重新开始。所以我希望保持TitleSwitch()函数按原样运行,只需替换它正在使用的值。

5 个答案:

答案 0 :(得分:4)

您可以通过将array函数中的fn公开给外部上下文来实现。

以下是一个例子:

function TitleSwitch() {
        var counter = 0;
        this.array = ['Value1','Value2','Value3'];
        var self = this;
        this.fn = function () {
            $(document).prop('title', self.array[counter]);
            console.log(self.array[counter]);
            counter++;
            counter %= self.array.length;
        };
        this.fn();
    }
    var switcher = new TitleSwitch()
    setInterval(switcher.fn, 500);

    function asyncFn(){
      switcher.array[0] = "changed title1";
    }

    setTimeout(asyncFn, 1000)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

答案 1 :(得分:1)

在构造函数中传递它,以便您可以从外部控制访问级别。

在示例中:

  • myArray是在TitleSwitch创建的闭包之外定义的。
  • 编辑其值时,下一次迭代将使用更新的内容。

像这样:

function TitleSwitch(array) {
    var counter = -1,
        fn = function () {
            counter++;
            counter %= array.length;
            // Move to bottom to prevent errors when using a shorter array
            console.log(array[counter]);
        };
        fn();
    return fn;
}

var myArray = ['Value1','Value2','Value3'];

setInterval(TitleSwitch(myArray), 1000);

myArray[1] = "TEST";
myArray[2] = "TEST2";

答案 2 :(得分:1)

我认为你必须从你的功能范围中取出你的变量,如下所示:

Undefined variable: "$i".

答案 3 :(得分:0)

无法替换在array内定义为局部变量的fn。如果你将它拉到TitleSwitch之外,你可以给它一个新值。或者,您可以在fn上使用属性,或构建更复杂的对象,以避免污染环境。

您还想将模数线提升到fn的开头:例如:如果您有一个5个元素的列表,counter4,并且您将array替换为2个元素的列表,那么您的代码就会中断。

答案 4 :(得分:0)

var array = ['Value1','Value2','Value3'];
function TitleSwitch() {
    var counter = 0,
        fn = function () {
           
            $(document).prop('title', array[counter]);
          console.log(array[counter]);
            counter++;
            counter %= array.length;
        };
        fn();
    return fn;
}
setInterval(TitleSwitch(), 5000);

function pollingDoneCallback(data){
if(data){
  array=[];
  for(var i=0;i<data.length;i++)
  array.push(data[i]);
 }
}
pollingDoneCallback(['val5','val6']);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>