【Web前端】setInterval(para1,para2)) 中 para1 的引号和括号问题

来源:互联网 发布:监控系统 知乎 编辑:程序博客网 时间:2024/06/06 02:26

前言

在使用 setInterval 的时候,传入的第一个参数——函数,发现了一些问题。

在<head>标签中使用 Js

window.onload = function () {    var num = 2;     function auto(){     alert(num); } setInterval("auto",2000); //或是 setInterval("auto()",2000);

会弹出

Uncaught ReferenceError: auto is not definedat xxxxx

后来又试了一下

window.onload = function () {    var num = 2;     function auto(){     alert(num); } setInterval(auto,2000); //或是 setInterval(auto(),2000);

这样会发现弹出警告框,并显示 2 ,定时器也能正常发挥效果。但是另一个加了括号的,就只会运行一次,没有定时的效果。

引号问题:

加引号是标明去全局变量中寻找 auto() 方法,如果是

window.onload=function() {    function test(){        alert(11);    }setTimeout("test()",2000);}

因为 test() 方法是在 window.onload,setTimeout(“test()”,2000);在全局中是找不到 test() 方法的,所以会报错。
如果是这样,可以修改成以下状态就可以了。

window.onload=function() {    setTimeout("test()",2000);}function test(){    alert(11);}

在<body>标签中使用 Js

其他部分一样,加引号的情况这里可以正常作用:

var num = 2; function auto(){     alert(num); } setInterval("auto()",2000); 

总结

函数调用必须加括号,即使无参数。加括号返回的是函数执行完的值, 不加括号直接返回的是函数——这个通常用于把函数当做参数传递另一个函数中去。

关于引号那部分,报错与正常执行的问题:

setInterval(“fun()”,1000); 这种调用在<head>中报未定义,在全局我们已经说过了 。我们可以把带引号的参数理解为:可执行代码 。

内部可以访问其上层的函数和变量,而外部却不能访问内部的函数和变量。JavaScript有一个预编译处理,首先对函数和变量进行预编译。也就是说其函数和变量作用域是在其声明的时候确定的,而不是在执行的时候确定。

当setInterval把”fun()”执行环境换为全局的后,对fun的调用是无效的。因为全局不能访问局部的函数和变量。window.onload相对于window来说就是局部的。

以上引用来自 Jay-Liu ,在此感谢。

作用域相关问题

0 0
原创粉丝点击