学过JavaScript 脚本语言的都应该接触过setInterval 函数.如何使用我想大家都知道,但是有时候对于刚刚接触JavaScript的朋友来讲,还是会在使用的时候碰到这样或那样的问题而感到困惑!以下是经常在QQ群中碰到问的最多的问题。如下图:

首先声明:本人JavaScript技术水平较低,以下所诉完全是依照自己的理解来做一些说明。如果有不当之处,还请批评斧正!以下就全当是在扯蛋吧,扯的很显浅,
扯深了自己搞不定,还会扯疼的!

在JavaScript中的setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式。setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭。由 setInterval() 返回的 ID 值可用作 clearInterval() 方法的参数来将其停止。

其实以上对函数的调用均能执行。首先我们看以下代码:

   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<script type="text/javascript">
function fun() {
alert(1);
}
setInterval("fun()",1000);//全局作用域下正常执行
setInterval(fun(),1000); //调用函数正常,setInterval调用出错
setInterval(fun,1000); //正确
</script>
</head>
<body> </body>

</html>

我所写的代码和提问题的人是相同的,唯一的区别就是函数名不同罢了!如果大家做了相关测试都应该知道,就以上代码来说都会弹出结果1.
当然以上代码其执行环境为全局。setInterval 第一个参数 可以是函数名、匿名函数、函数的引用以及其他可执行代码。(个人理解)

 setInterval("fun()",1000);

其中这种加引号的调用就可以理解为“可执行代码” ,就行eval 一样去执行。第一个参数,就是对fun方法的调用 。理所当然的弹出 1 。 一秒钟间隔,一直执行。

   setInterval(fun(),1000);

对于这种调用方式我不理解使用者用setInterval 的意图为何.
fun() 是对函数的直接调用。也就是说当setInterval还没有开始执行,函数fun就执行了。如果这个函数没有返回值或者返回值不是可执行的函数或者其他的代码的话,就以上代码而言只是弹出1,之后就遍报错了.
难道这样的调用真的不可以吗?其实是可以的!例如代码:

           function funone() {
return function () {
alert("qishiwoyenengzhixing");
}
}
setInterval(funone(), 1000); //每隔一秒钟都会弹出 qishiwoyenengzhixing 你信不信,反正我信了

就我个人认为这种设计或者调用完全没有任何意义。在此只做一下简单的说明吧!

setInterval(fun,1000); //这种方法是正确的。

大家可以把这种调用setInterval的方式的第一个参数看作参数为 函数名或函数的引用。当然还可以直接使用匿名函数,如:

setInterval(function () {
        alert(</span>"我一秒中执行一次"<span style="color: #000000;">);
}, </span>1000);</pre>

有些人刚接触JavaScript可能发现,在全局作用域下  setInterval("fun()",1000); 可以正常执行,但放到window.onload函数中却不能执行。为什么呢?(其实一开始我也碰到了相同的问题)

代码如下:

window.onload = function () {
function fun() {
alert(1);
}
setInterval("fun()",1000);//这个报错了 未定义 重点在这一个
// setInterval(fun(), 1000); //这个和刚才全局的表现一样
// setInterval(fun,1000);//这个没有问题 };

setInterval("fun()",1000); 这种调用报未定义,在全局讲解中我们已经说过了 。可以把带引号的参数理解为 “可执行代码” ,
而setInterval现在把以引号包括的“可执行代码进行”处理。就像eval一样给予执行。其在执行中 fun() 执行环境发生了变化,不是在window.onload方法下,而是在全局执行环境中也就是window.大家应该知道JavaScript存在作用域链,由内向外依次查找。内部可以访问其上层的函数和变量,而外部却不能访问内部的函数和变量。JavaScript有一个预编译处理,首先对函数和变量进行预编译。也就是说其函数和变量作用域是在其声明的时候确定的,而不是在执行的时候确定。当setInterval把"fun()"执行环境换为全局的后,对fun的调用是无效的。因为全局不能这样访问局部的函数和变量。window.onload相对于window来说就是局部的。其实就是一个作用域的问题。

对于setInterval(fun(), 1000)和setInterval(fun,1000)的调用其执行环境并没有改变,所以是可以访问的到的window.onload下声明的函数。只不过setInterval(fun(), 1000)执行fun函数后 会报错的,setInterval其调用错误。为什么错误?在之前已经讲过了,这里就不啰嗦了!

为了证明自己的的理解为第一个参数加引号 以“可执行代码” 执行。以下是自己写的两段代码进行的测试:

function fun1() {
alert(1);
}
setInterval("alert(fun1)",2000);//你认为结果是多少?
 setInterval("var a=1;var b=2;c=a+b;alert(c);",1000); //这个呢?

以上内容是个人的理解,因为自己在之前也碰到了相同的问题!也许仅仅对于刚学JavaScript的朋友有一点帮助。当然可能存在错误(包括错别字),欢迎各位大牛批评斧正!。如果你有意帮助本人提高,请留下你宝贵的建议。请不要因此进行谩骂(其实完全可以把此作为一个笑话)!谢谢!

原文:https://www.cnblogs.com/bluescreen/archive/2013/05/19/3086399.html?utm_source=tuicool

posted @
2019-07-31 13:45 
橱窗外的小孩 
阅读(...) 
评论(...) 
编辑 
收藏

JavaScript中setInterval函数应用常见问题之一(第一个参数不加引号与加引号的区别)的更多相关文章

  1. JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解

    二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 ...

  2. Javascript中call函数和apply函数的使用

    Javascript 中call函数和apply的使用: Javascript中的call函数和apply函数是对执行上下文进行切换,是将一个函数从当前执行的上下文切换到另一个对象中执行,例如: so ...

  3. Javascript中的函数(Function)与对象(Object)的关系

    今天我们来尝试理解Function和Object.因为这个里面有些人前期可能会搞糊涂.他们之间到底是什么关系.当然也不除外当初的我. 注意:官方定义: 在Javascript中,每一个函数实际上都是一 ...

  4. 浅析 JavaScript 中的 函数 currying 柯里化

    原文:浅析 JavaScript 中的 函数 currying 柯里化 何为Curry化/柯里化? curry化来源与数学家 Haskell Curry的名字 (编程语言 Haskell也是以他的名字 ...

  5. 谈谈javascript 中的函数问题

    聊聊javascript中的函数 本文可作为李刚<疯狂htmlcssjavas讲义>的学习笔记 先说一个题外话 前几天在知乎上流传着一个对联  上联是雷锋推到雷峰塔 nnd 这是什么对联? ...

  6. 浅析 JavaScript 中的 函数 uncurrying 反柯里化

    柯里化 柯里化又称部分求值,其含义是给函数分步传递参数,每次传递参数后部分应用参数,并返回一个更具体的函数接受剩下的参数,这中间可嵌套多层这样的接受部分参数函数,直至返回最后结果. 因此柯里化的过程是 ...

  7. Javascript中的函数(三)

    一:概述 函数是进行模块化程序设计的基础,编写复杂的Ajax应用程序,必须对函数有更深入的了解.JavaScript中的函数不同于其他的语言,每个函数都是作为一个对象被维护和运行的.通过函数对象的性质 ...

  8. java基础62 JavaScript中的函数(网页知识)

    1.JavaScript中,函数的格式 function 函数名(形参列表){ 函数体; } 2.JavaScript中,函数需要注意的细节 1.在javaScript中,函数定义形参时,是不能使用v ...

  9. Javascript中的函数数学运算

    1.Math函数与属性使用语法 Math.方法名(参数1,参数2,...); Math.属性; 说明 Math函数可以没有参数,比如Math.random()函数,或有多个参数,比如Math.max( ...

随机推荐

  1. (转)Loadrunner教程--常用操做流程

    1loadrunner压力测试一般使用流程 1.1loadrunner压力测试原理 本质就是在loadrunner上模拟多个用户同时按固定行为访问web站点.其中固定行为在loadrunner中是通过 ...

  2. UltraISO安装windows10时0x8007000D错误解决办法

    进入安装界面之后提示错误:windows无法打开所需的文件 F:\Sources\install.wim.请确保安装所需的所有文件可用,并重新启动安装.错误代码:0x8007000D 原因: 肯定是i ...

  3. C# 发送Post请求(带参数)

    此处内容传输都是用UTF-8编码 1.不带参数发送Post请求 /// <summary> /// 指定Post地址使用Get 方式获取全部字符串 /// </summary> ...

  4. DApp是什么,DApp是必然趋势

    DApp是什么,DApp是必然趋势  https://www.jianshu.com/p/dfe3098de0de Thehrdertheluck关注 12018.04.23 11:54:00字数 2 ...

  5. GraphQL漏洞案例之获取Facebook任意用户的朋友列表和部分支付卡详细信息

    Facebook有一个GraphQL endpoint,只能由Facebook的某些应用程序使用.需要用户(或页面)access_token来查询GraphQL endpoint. 这里可以将Face ...

  6. Win10 专业版 Hyper-V 主机计算服务无法启动

    Windows 10升级1809版本后,发现Hyper-V不能用了,管理器里是一片空白,看服务Hyper-V 主机计算服务没有启动,手动启动的话失败,报错,代码1053. 自己尝试修复,也百度了很久, ...

  7. 在Angular中使用element

    在angular中使用element 1.在一个新建的angular的项目中插入element npm i --save element-angular 2.在项目中的styles.css中插入文件, ...

  8. 基于面绘制的MC算法以及基于体绘制的 Ray-casting 实现Dicom图像的三维重建(python实现)

    加入实验室后,经过张老师的介绍,有幸与某公司合共共同完成某个项目,在此项目中我主要负责的是三维 pdf 报告生成.Dicom图像上亮度.对比度调整以及 Dicom图像三维重建.今天主要介绍一下完成Di ...

  9. Java基础---Java环境配置

    java 下载:https://www.java.com/zh_CN/ 1.Java安装:jdk9 2. JAVA_HOME 环境变量的配置 在DOS命令行下使用这些工具,就要先进入到JDK的bin目 ...

  10. LeetCode 5215. 黄金矿工(Java)DFS

    题目: 5215. 黄金矿工 你要开发一座金矿,地质勘测学家已经探明了这座金矿中的资源分布,并用大小为 m * n 的网格 grid 进行了标注.每个单元格中的整数就表示这一单元格中的黄金数量:如果该 ...