请指点js setTimeout的参数的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请指点js setTimeout的参数的问题相关的知识,希望对你有一定的参考价值。

如何修改以下代码以输出正确的myName值“Foo function.”?原因?

foo = function() this.myName = "Foo function.";
foo.prototype.sayHello = function() alert(this.myName);
foo.prototype.bar = function()
setTimeout(this.sayHello, 1000);//这里直接用的this.sayHello

var f = new foo; f.bar();

我现在知道怎么改了,该成下面的就行了

foo = function() this.myName = "Foo function.";
foo.prototype.sayHello = function() alert(this.myName);
foo.prototype.bar = function()
setTimeout(this.sayHello(), 1000); // 这里用的this.sayHello() 多一对括号

var f = new foo; f.bar();

但是为什么呢? 请教原因啊

<script language="javascript">
    foo = function()
     
        this.myName = "Foo function.";
    
    
    foo.prototype.sayHello = function()
     
        alert(this.myName);
    
    
 foo.prototype.bar = function()
    
        var root = this; // 先用变量引用到this指针
  setTimeout(function()
        
            root.sayHello(); // 用匿名函数包裹之后再调用
        , 1000 );
  
    
 var f = new foo();
    
    f.bar();
 </script>

你的两种方法都是不对的, 虽然第二种看似是输出了正常的结果, 但是你的setTimeout就没起作用.

我给你的这个才是正解

你第一种情况确实是延迟调用到了sayHello函数, 但是问题是调用链出了问题, 其中的this指向window不是f, 所以输出undefined

第二种情况相当于直接调用f.sayHello()确实输出了正确的结果, 但是setTimeout就多余了, 结果是没有延迟直接输出的

参考技术A setTimeout(code,millisec);

code 必需。要调用的函数后要执行的 JavaScript 代码串。
millisec 必需。在执行代码前需等待的毫秒数。
this.sayHello是方法名,this.sayHello()是方法,这里需要的是code,所以。。

JS setTimeout 循环传入参数问题

for(var i=0;i<4;i++)
setTimeout(function()
console.log(i);
,0);

这样输出是 4444 我应该怎么做输出0123?
我只是把问题简化,真正的问题必须调用 setTimeout

//不需要计时器
var str = \'\';
for(var i=0;i<4;i++)
    str += i+\'\';   

console.log(str)

 如果你的项目里必须用计时器,最好把关联的代码都贴出来哦~

参考技术A var i = 0;
function m()
alert(i);
i++;
setTimeout(m, 10);

setTimeout("m()", 1000);
解释:setTimeout() 只执行 code 一次。如果要多次调用,请使用 setInterval() 或者让 code 自身再次调用 setTimeout()。
参考技术B 方法1:
for(var i=0;i<4;i++)
setTimeout(function(i)
console.log(i);
, 0, i);

方法2(使用let关键字):
for(let i=0;i<4;i++)
setTimeout(function()
console.log(i);
, 0;
参考技术C
for (var i = 0;i<=100;i++)

    // 用new的形式会更好吧
    (function (tag) 

        setTimeout(function () 
            console.log(tag);//tag就是i。
        ,1000*i)//相当于有100个定时器,依次在第1、2、3....100秒后执行。

    )(i)

    

两个关键,一个是参数保存下来,函数也好,对象也好,另一个是每隔多少毫秒执行就用 i 乘以多毫秒

以上是关于请指点js setTimeout的参数的问题的主要内容,如果未能解决你的问题,请参考以下文章

JS setTimeout 循环传入参数问题

Js:没有函数参数的setTimeOut? [复制]

js setTimeout 传递参数

解决 js setTimeout 传递带参数的函数无效果

js settimeout干啥用

js setTimeout如何调用自身所在的函数(有参数传递的)?