settimeout 内存泄漏第一个参数为字符串为什么会内存泄漏

jquery settimeout传递字符串参数报错的解决方法
当你打算调用一些jquery代码显示隐藏地一个元素,并调用settimeout()在一段延时之后设置其html地内容:
整个页面地代码是这样地.
&span style=font-size:18&&html&
&title&&/title&
&a href=# id='heihei' onclick=shownext('i am veinei ')&show next&/a&
&a href=# id=log style=display:none &yes,i am the next &/a&
&script type=text/javascript src=jquery-1.10.2.min.js&&/script&
&script type=text/javascript&
function shownext(text){
settimeout($('#log').show().text(text),1000);
.show()确实调用成功了.但是.text()调用失败了.console显示 text未定义.
对于这个问题,我确实没有找到更好地答案...我想是不是jquery对这个传入settimeout()函数地内容做了修改导致变量失效.
我紧接着做了下一个实验.
&span style=font-size:18&&html&
&title&&/title&
&a href=# id='heihei' onclick=shownext('i am veinei ')&show next&/a&
&a href=# id=log style=display:none &yes,i am the next &/a&
&script type=text/javascript src=jquery-1.10.2.min.js&&/script&
&script type=text/javascript&
function shownext(text){
settimeout(alert(text),1000);
我要看看是不是确实是jquery出了问题.的到地是同样地错误.
后来找了本书看了看.发现了问题地所在.
settimeout() 接受一个字符串参数时,它执行于全局作用域,也就是说,它位于任何函数之外.最简单地修复手段就是使用一个局部函数(匿名函数)来解决这个问题.
&span style=font-size:18&&html&
&title&&/title&
&a href=# id='heihei' onclick=shownext('i am veinei ')&show next&/a&
&a href=# id=log style=display:none &yes,i am the next &/a&
&script type=text/javascript src=jquery-1.10.2.min.js&&/script&
&script type=text/javascript&
function shownext(text){
settimeout(function(){$('#log').show().text(text);},1000);
成功解决这个问题.
: 更多热点信息信息请查看:标签:至少1个,最多5个
题目为什么叫setTimeout的第一个参数而不是回调函数?如果你心中有稍有疑惑,或许应该看看下面的文章
我们日常使用setTimeout(),一般是将函数作为第一个参数,但是也有例外情况,先看以下代码:
function test() {
var cl = function() {
console.log(666)
setTimeout('cl()', 1500)
将以上代码CV到chrome中的console,运行发现:
Uncaught ReferenceError: cl is not defined
没有定义cl函数,奇怪是并没有报Uncaught SyntaxError: Unexpected identifier这样的语法错误,查javascript MDN我们就会发现:
setTimeout允许讲一个字符串作为第一个参数,而且js内部将会调用eval()函数用来动态执行一段字符串脚本,至于为什么找不到cl函数,我们猜想是作用域问题,既然是eval动态执行,我们在字符串参数中输出当前this绑定的对象:
function test() {
var cl = function() {
console.log(666)
setTimeout('console.log(this);cl()', 1500)
执行后发现:
原来this绑定window全局对象,这下明白了,eval()执行动态脚本的时候,在全局作用域并没有找到我们定义在函数test内部的cl,所以会报错。
我们将cl定义移到外部:
————分割线————
var cl = function() {console.log(666)}
setTimeout(cl(), 1500)
经常看到有新人在社区上问这段代码为什么没有延迟执行,只需注意这边的cl()是一个函数执行而不是函数定义,如果想延迟执行,我们需要传递一个函数地址,比如:
var cl = function() {console.log(666)}
setTimeout(cl, 1500)
或者直接return一个函数:
var cl = function() {
return function() {
console.log(666)
setTimeout(cl(), 1500)
又或者参数处直接定义:
setTimeout(function() {console.log(666)}, 1500)
归根结底还是搞清引用函数地址和执行函数的区别
————分割线————
以上规则也同样适用于字符串参数,只是字符串参数中要加上()保证eval的时候执行,不要到时候只是eval了一个地址 =。=,比如这样:
var cl = function() {
console.log(666)
function test() {
setTimeout('cl', 1500)
执行一下,啥屁也没看到 = 。=
总之,在setTimeout的时候尽量不要用字符串的参数,因为eval()具有许多不可预见的危险性,比如说可能有意外的运行结果,可能隐式创建全局变量,闭包作用域解析过多消耗,xss,运行慢啊巴拉巴拉之类的。但是我们也需要了解下js的一些黑魔法,以防到时候懵逼。
0 收藏&&|&&0
你可能感兴趣的文章
3 收藏,403
7 收藏,6.2k
分享到微博?
技术专栏,帮你记录编程中的点滴,提升你对技术的理解收藏感兴趣的文章,丰富自己的知识库
明天提醒我
我要该,理由是:
setTimeout 定义和用法:
setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式。
setTimeout(code,millisec)
setTimeout(&alert('5seconds!')&,5000)
错误的写法 setTimeout(alert('5seconds!'),5000)
搞了我半天,郁闷死。仔细看函数的用法,别想当然
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:332204次
积分:6734
积分:6734
排名:第3503名
原创:336篇
转载:138篇
评论:42条
(6)(9)(9)(9)(15)(8)(10)(5)(4)(10)(5)(6)(12)(12)(3)(3)(6)(13)(5)(11)(10)(5)(7)(9)(6)(22)(5)(8)(25)(10)(4)(11)(9)(19)(21)(9)(5)(12)(14)(16)(28)(34)(1)(8)(9)(1)(1)(1)(1)(1)(1)

我要回帖

更多关于 settimeout 参数 的文章

 

随机推荐