首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么人们说javascript eval()是邪恶的,但你对setTimeout和setInterval等没有异议?

人们说JavaScript的eval()函数是邪恶的,主要是因为它存在安全风险和性能问题。eval()函数可以执行任意的JavaScript代码字符串,这意味着它可以执行来自不可信源的恶意代码,从而导致安全漏洞。此外,eval()函数的执行会导致动态解析和编译代码,对性能有一定的影响。

相比之下,setTimeout和setInterval等函数并不具有相同的安全和性能问题。这些函数用于实现定时执行代码的功能,但它们并不会执行任意的代码字符串,而是接受一个函数作为参数进行执行。因此,它们不会引入安全风险。

此外,setTimeout和setInterval等函数的使用是受限的,它们通常用于实现一些需要延迟执行或定时执行的功能,比如动画效果、定时刷新数据等。相比于eval()函数,它们的使用场景更加明确,不会被滥用。

总结来说,人们认为JavaScript的eval()函数是邪恶的主要是因为它的安全风险和性能问题,而setTimeout和setInterval等函数则没有这些问题,并且有明确的使用场景。因此,对于eval()函数的使用应该谨慎,而对于setTimeout和setInterval等函数的使用则没有异议。

(注:腾讯云相关产品和产品介绍链接地址请自行搜索,不便提供)

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

JavaScript糟粕部分

JavaScript是一门优秀的语言,但是难免存在着某些缺点,本博文主要说明下JavaScript的一些缺点。 JavaScript有两组相等的运算符:===和!==,以及他们邪恶的孪生兄弟==和!...最好永远不要使用那对邪恶的孪生兄弟。相反的,请始终使用===和!==。如果上面的比较都是用===运算符,结果都是false,在编程中规定使用,很是受益。 ⚠️传递性是一种编程约定。...eval eval函数传递了一个字符串给JavaScript编译器,并且执行其结果。它是一个被滥用的JavaScript特性。那些对JavaScript语言一知半解的人们最常用到它。...Function 构造器是eval的另一种形式,同样也应该避免使用它。 浏览器提供的setTimeout和setInterval函数,他们能够接受字符串参数或函数参数。...当传递的是字符串参数时,setTimeout和setInterval会像eval那样去处理。同样也应该避免使用字符串参数形式。 continue语句 continue语句跳转到循环的顶部。

48310

译文:开发人员面临的 10个最常见的JavaScript 问题

你收到上述错误的原因是,当你调用setTimeout()时,你实际上是在调用window.setTimeout()。...这是为什么? 内存泄漏几乎是不可避免的JavaScript问题,如果你没有有意识地编码以避免它们。 让我们更详细地研究一下: 每个theThing对象都包含自己的1MB longStr对象。...例如,对于许多JavaScript开发人员来说,以下一些内容是很麻烦的: 关于最后两个,尽管是空的(这可能会导致人们相信他们会评估为false),但{}和[]事实上,是对象,任何对象都将被迫在JavaScript...很少解释的是,如果你将字符串作为setTimeout或setInterval的第一个参数传递,它将传递给函数构造函数以转换为新函数。这个过程可能缓慢且效率低下,而且没必要。...那么,这里将是setInterval和setTimeout的相当典型的使用,将字符串作为第一个参数: 更好的选择是传入函数作为初始参数;例如: JavaScript 问题#10:未能使用“严格模式”

1.3K20
  • 开发人员面临的10个最常见的JavaScript问题

    事实上,对于任何有经验的前端开发人员来说,在网页中建立基本的JavaScript功能是一项相当简单的任务,即使他们是JavaScript新手。然而,这种语言比人们最初认为的要细致、强大和复杂得多。...JavaScript中对块级作用域的支持是通过let关键字实现的。Let关键字已经被浏览器和Node.js等后端JavaScript引擎广泛支持了多年。...问题5:低效的DOM操作 使用 JavaScript 操作DOM(即添加、修改和删除元素)是相对容易,但操作效率却不怎么样。...很少有人解释的是,如果你把字符串作为setTimeout或setInterval的第一个参数,它将被传递给函数构造器,被转换成一个新函数。这个过程可能很慢,效率也很低,而且很少有必要。...使得eval()更加安全。eval()在严格模式和非严格模式下的行为方式有一些不同。最重要的是,在严格模式下,在eval()语句中声明的变量和函数不会在包含的范围内创建。

    82810

    《JavaScript语言精粹》学习笔记

    和大多数其他语言不同,JavaScript的数组的length是没有上界的。 !!! 数组的length属性不一定等于数组的长度。...JavaScript没有一个好的机制来区别数组和对象。...附录A - 毒瘤 JavaScript中一些不可避免的问题特征,你必须知道这些问题并准备好应对的措施。 伪数组 JavaScript没有真正的数组。...== JavaScript有梁旭相等运算符: ===和!==,以及它们的邪恶的孪生兄弟==和!=。 如果两个运算数类型一致且拥有相同的值,则===返回true,否则!==返回false。 ==和!...浏览器提供的setTimeout和setInterval函数,它们能接受自渡船参数或者函数参数,当传递的是字符串参数时,setTimeout和setInterval函数会像eval那样去处理,所以应该避免使用字符串参数形式

    38420

    setInterval的用法

    func 是你想要重复调用的函数。 code 是另一种语法的应用,是指你想要重复执行的一段字符串构成的代码(使用该语法是不推荐的,不推荐的原因和eval()一样)。...delay 是每次延迟的毫秒数 (一秒等于1000毫秒),函数的每次调用会在该延迟之后发生。和setTimeout一样,实际的延迟时间可能会稍长一点。...需要注意的是,IE不支持第一种语法中向延迟函数传递额外参数的功能.如果你想要在IE中达到同样的功能,你必须使用一种兼容代码 (查看callback arguments 一段)....无论使用setInterval()还是setTimeout(),函数的执行环境会被设置成window,也就是说在函数内使用this其实是指window对象(或global全局对象,ES没有指明如何访问global...MDN原文建议用自己写的setInterval代替原生的setInterval,众所周知JavaScript函数的prototype包括call和apply方法,这两种方法的第一个参数可以接受this的值

    1.4K20

    【前端技能树-需要避免的坑】Javascript 开发者容易在花田里犯的错

    一切都取决于你的开发/生产环境。你得到这个错误的原因是因为,当你调用 setTimeout() 时,你实际上是在调用 window.setTimeout()。...至于最后两个,尽管是空的,但{}和[]实际上都是对象,并且任何对象都将在JavaScript 中强制为布尔值 true,这与ECMA-262规范一致。...没有使用 “严格模式” “严格模式”是一种在运行时自愿对 JavaScript 代码执行更严格的解析和错误处理的方法,也是一种使代码更安全的方法。...使 eval()更安全。eval()在严格模式和非严格模式下的行为方式有所不同。最重要的是,在严格模式下,在eval()语句中声明的变量和函数不会在包含范围内创建。...相反,缺乏对 JavaScript 概念的正确理解是许多 JavaScript问题的根源。彻底熟悉语言的细微差别和微妙之处是提高你的编码效率的最有效策略。

    19911

    你所不知道的setTimeout

    JavaScript提供定时执行代码的功能,叫做定时器(timer),主要由setTimeout()和setInterval()这两个函数来完成。它们向任务队列添加定时任务。...由于前面的任务到底需要多少时间执行完,是不确定的,所以没有办法保证,setTimeout和setInterval指定的任务,一定会按照预定时间执行。...答案是不会。因为setTimeout运行机制说过,必须要等到当前脚本的同步任务和“任务队列”中已有的事件,全部处理完以后,才会执行setTimeout指定的任务。...setTimeout和setInterval返回的整数值是连续的(一定环境下,比如浏览器控制台,或者js执行环境等),也就是说,第二个setTimeout方法返回的整数值,将比第一个的整数值大1。...: 你所不知道的setInterval JavaScript 之 this 详解 JavaScript 字符串实用常操纪要 Javascript 数组操作 JavaScript 字符串间的比较

    1.8K121

    setTimeout的那些事

    在不使用其它新员工(webworker等)的情况下,JS是如何在单线程上处理复杂的操作和逻辑,以至于在用户看来可以同时响应不同的操作的呢? 我们还是以Boss来称呼javascript的主线程吧。...他Promise会帮你做的任务肯定会做(只要他没有猝死。。),但时间上可能并不一定严格符合你的要求,毕竟小本本上可能不仅只有一条任务。...setInterval:我愚蠢的弟弟啊。。肯定是你使用的方法不对! setTimeout:考虑到JS运行环境的特点,你的定时方法可能会连续执行,之间没有预期的间隔。...你是说JS主线程的步同任务执行时间很长,并且异步队列中只有我在往其中添加任务,导致我在异步队列中重复添加的任务没有及时被执行,然后JS主线程空闲后,我添加的多个任务就会连续执行,是吗?...setTimeout:你说的那个检测机制我知道,我想说的是,当JS主线程中正在执行你添加的任务,如果此时异步任务队列为空,你再向队列中添加异步任务时,JS主线程执行完你上次添加的任务,会立刻执行你这次添加的任务

    1.6K10

    setTimeout的那些事

    在不使用其它新员工(webworker等)的情况下,JS是如何在单线程上处理复杂的操作和逻辑,以至于在用户看来可以同时响应不同的操作的呢? 我们还是以Boss来称呼javascript的主线程吧。...他Promise会帮你做的任务肯定会做(只要他没有猝死。。),但时间上可能并不一定严格符合你的要求,毕竟小本本上可能不仅只有一条任务。...setInterval:我愚蠢的弟弟啊。。肯定是你使用的方法不对! setTimeout:考虑到JS运行环境的特点,你的定时方法可能会连续执行,之间没有预期的间隔。...你是说JS主线程的步同任务执行时间很长,并且异步队列中只有我在往其中添加任务,导致我在异步队列中重复添加的任务没有及时被执行,然后JS主线程空闲后,我添加的多个任务就会连续执行,是吗?...setTimeout:你说的那个检测机制我知道,我想说的是,当JS主线程中正在执行你添加的任务,如果此时异步任务队列为空,你再向队列中添加异步任务时,JS主线程执行完你上次添加的任务,会立刻执行你这次添加的任务

    2.1K00

    js 定时器笔记

    一、定时器(timer) JavaScript提供定时执行代码的功能,该功能主要由setTimeout()和setInterval()这两个函数来实现 二、setTimeout() 1、使用规则 setTimeout...2、使用注意 推迟执行的代码必须以字符串的形式,放入setTimeout。 因为引擎内部使用eval函数,将字符串转为代码。 如果推迟执行的是函数,则可以直接将函数名,放入setTimeout。...一方面eval函数有安全顾虑,另一方面为了便于JavaScript引擎优化代码,setTimeout方法一般总是采用函数名的形式 ?...四、解除定时器clearTimeout(),clearInterval() setTimeout和setInterval函数,都返回一个表示计数器编号的整数值。...同步任务是那些没有被引擎挂起、在主线程上排队执行的任务。只有前一个任务执行完毕,才能执行后一个任务。 异步任务是那些被引擎放在一边,不进入主线程、而进入任务队列的任务。

    7.4K60

    每天10个前端小知识 【Day 12】

    说说你对事件循环的理解 JavaScript 在设计之初便是单线程,即指程序运行时,只有一个线程存在,同一时间只能做一件事 为什么要这么设计,跟JavaScript的应用场景有关 JavaScript...简单的来说,执行上下文是一种对Javascript代码执行环境的抽象概念,也就是说只要有Javascript代码运行,那么它就一定是运行在执行上下文中 执行上下文的类型分为三种: 全局执行上下文:只有一个...说说你对闭包的理解,以及闭包使用场景 一个函数和对其周围状态(lexical environment,词法环境)的引用捆绑在一起(或者说函数被引用包围),这样的组合就是闭包(closure)。...也就是说,闭包让你可以在一个内层函数中访问到其外层函数的作用域。 在 JavaScript 中,每当创建一个函数,闭包就会在函数创建的同时被创建出来,作为函数内部与外部连接起来的一座桥梁。...在前端实现中我们一般通过 setTimeout 和 setInterval 方法来实现一个倒计时效果。

    13710

    Web前端新手都应该了解的JavaScript 开发技巧

    为了最大化的减少类似错误,请在你的 debugger 中运行你的代码,确认你没有遇到任何细微的错误。 4、避免 Eval 你的 JS 在没有 eval 方法的时候也可以很好的工作。...5、 最小化 DOM 访问 DOM 是最复杂的 API,会使得代码执行过程变慢。有时候 web 页面可能没有加载或者加载不完整。最好避免 DOM。...6、尽可能的保持代码简洁 可能大家都听到过了N遍这个代码简洁问题了。作为一个开发人员你可能在你的代码开发过程中使用了很多次,但千万不要在 js 开发中忘记这点。...§ 尽量在开发模式中添加注释和空格,这样保持代码的可读性 § 在发布到产品环境前请将空格和注释都删除,并且尽量缩写变量和方法名 使用第三方工具帮助你实现压缩 javascript。...7、不要用 “SetTimeOut” 和 “Setinterval” 方法来作为 “Eval” 的备选 setTimeOut( "document.getID('value')", 3000); 在以上代码中

    49600

    小白理解 JavaScript 执行机制

    1.JavaScript为什么是单线程? JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。那么,为什么JavaScript不能有多个线程呢?这样能提高效率啊。...setTimeout() 和 setInterval() 产生的任务是 异步任务,也属于 宏任务。 setTimeout() 接受两个参数,第一个是回调函数,第二个是推迟执行的毫秒数。...所以说,setTimeout() 和 setInterval() 第二个参数设置的时间并不是绝对的,它需要根据当前代码最终执行的时间来确定的,简单来说,如果当前代码执行的时间(如执行200ms)超出了推迟执行...(setTimeout(fn, 100))或反复执行的时间(setInterval(fn, 100)),那么setTimeout(fn, 100) 和 setTimeout(fn, 0) 也就没有区别了...,setInterval(fn, 100) 和 setInterval(fn, 0) 也就没有区别了。

    61432

    setTimeout和requestAnimationFrame

    目录 单线程模型 任务队列 setTimeout setTimeout和setInterval requestAnimationFrame requestidlecallback 单线程模型 JavaScript...为什么JavaScript是单线程的呢? 这主要与JavaScript用途有关。它的主要用途是与用户互动,以及操作DOM。...多进程可以充分利用现代 CPU 多核的优势。 方便使用沙盒模型隔离插件等进程,提高浏览器的稳定性。 进程和线程又是什么呢 进程(process)和线程(thread)是操作系统的基本概念。...而javascript引擎对这个问题的解决是:当使用setInterval()时,仅当没有该定时器的任何其他代码实例时,才将定时器代码添加到队列中。...,类似于setTimeout,主要用途是按帧对网页进行重绘。

    1.8K20

    JavaScript怎么模拟 delay、sleep、pause、wait 方法

    但如果你对“为什么”和“怎么做”的原因感到好奇,还有更多可以学习的内容。JavaScript中处理时间有其细微之处,了解这些可能会对你有所帮助。...理解JavaScript的执行模型 现在我们已经有了一个快速的解决方案,让我们深入了解JavaScript的执行模型的机制。理解这一点对于有效地管理代码中的时间和异步操作至关重要。...如何在JavaScript中正确使用SetTimeout 既然我们已经更好地理解了JavaScript的执行模型,让我们看看JavaScript是如何处理延迟和异步代码的。...; }, 2000); 也可以将一段代码字符串传递给 setTimeout 以供其执行: 然而,这种方法是不可取的,因为: 它很难阅读(因此很难维护和/或调试) 它使用了一个隐含的 eval,这是一个潜在的安全风险...好吧,也不完全是…… 如何在JavaScript中编写更好的Sleep函数 也许这段代码正是你所期望的,但请注意,它有一个很大的缺点:循环会阻塞JavaScript的执行线程,并确保在它完成之前没有人能与你的程序进行交互

    4.1K40

    定时器

    定时器 JavaScript提供定时执行代码的功能,叫做定时器(timer),主要由setTimeout()和setInterval()这两个函数来完成。...需要注意的是,推迟执行的代码必须以字符串的形式,放入setTimeout,因为引擎内部使用eval函数,将字符串转为代码。如果推迟执行的是函数,则可以直接将函数名,放入setTimeout。...一方面eval函数有安全顾虑,另一方面为了便于JavaScript引擎优化代码,setTimeout方法一般总是采用函数名的形式,就像下面这样。...运行机制 setTimeout和setInterval的运行机制是,将指定的代码移出本次执行,等到下一轮 Event Loop 时,再检查是否到了指定时间。...由于前面的任务到底需要多少时间执行完,是不确定的,所以没有办法保证,setTimeout和setInterval指定的任务,一定会按照预定时间执行。

    1.4K60

    【THE LAST TIME】彻底吃透 JavaScript 执行机制

    目录皆为暂定 执行 & 运行 首先我们需要声明下,JavaScript 的执行和运行是两个不同概念的,执行,一般依赖于环境,比如 node、浏览器、Ringo 等, JavaScript 在不同环境下的执行机制可能并不相同...而所谓的异步任务就是主线程执行到这个 task 的时候,“唉!你等会,我现在先不执行,等我 xxx 完了以后我再来等你执行” 注意上述我说的是等你来执行。...然后收拾电脑(同步任务)、收拾书包(同步任务)、给女朋友打电话说出来吃饭吧(必然是异步任务),然后女朋友说你等会,我先化个妆,等我画好了call你。...结果等她一个小时后说我化好妆了,我们出去吃饭吧。不行!我 bug 还没有解决掉呢?你等会。。。。其实这个时候你的一小时化妆还是 5 分钟化妆都已经毫无意义了。。。...这里我们只说 JavaScript 的执行机制。 如上所说,promise.then 、catch 和 finally 是属于 MicroTask。这里主要是异步的区分。

    45720

    11期前端冲刺必备指南-执行上下文作用域链闭包一等公民

    想必一部分程序员很少用过这,so,不必解释,但记住这是运行在eval函数中的代码,只有在eval函数中的代码才有eval函数执行上下文 理解了执行上下文(即环境),那么需要了解在JavaScript程序中的执行流...so,这就是为什么可以在声明之前访问var定义的变量,但如果在声明之前访问let和const定义的变量就会提升引用错误的原因。...而var id = setInterval(fn, delay)类似于setTimeout但连续调用该函数,直到被取消。...setTimeout和setInterval: setTimeout(function(){ setTimeout(arguments.callee, 10); },10); setInterval...它允许你为异步操作的成功和失败分别绑定相应的处理方法。这让异步方法可以像同步方法那样返回值,但并不是立即返回最终执行结果,而是一个能代表未来出现的结果的promise对象。

    88110
    领券