js中定时器调用函数时为什么会有引号
之前在学习的时候并没有发现的细节,关于js中,定时器的问题
这里我们写两个延时器
setTimeout(func, 0);
setTimeout("func()", 0);
定时器中,两个调用函数的方法都是正确的。
或许有人问了,为什么定时器调用函数的时候,有时候会写引号,有时候没有引号。
一开始我定时器都是像下面这样写的 ↓↓
setTimeout(()=>{ }, 0);
用箭头函数的方式写定时器,所以基本没在意过这个问题。
当我后来看别人写的代码的时候,发现定时器的方法调用上居然还写引号,还有这种调用方式吗?
后来经过查阅资料了解到
当你想用定时器,调用函数的时候,给函数传参的话,必须要加引号,否则会报错
setTimeout("func(a,b)", 0);
传参a ,b 就可以这么写。
如果不传参的话,完全可以写成
setTimeout(func, 0);
一问题得到解决从而表示你了解到的范围就更大了,随之而来的便是新的问题。
在定时器中加引号的同时,也会伴随着作用域的改变
setTimeout(func, 0); //这个定时器,它会优先寻找当前的作用域中是否有func函数,如果局部没有的话,则会依次按照顺序往上查找,直到全局作用域中。
setTimeout("func()", 0); //而这个定时器他的寻找func函数只会从全局寻找这个方法,不会从局部寻找。
同理而在定时器的函数中,this的指向也是不同的
在不加引号的定时器方法中
setTimeout(func, 0);
this的指向是指向当前函数的主人
而在加引号的定时器中
setTimeout("func()", 0);
他的指向永远是 Window