setTimeout 里 传递字符串代码报错
js高程 第三版 p203 重点:超时调用的代码都是在全局作用域中执行的,因此函数中this 的值在非严格模 式下指向window 对象,在严格模式下是undefined。
不过这里仅仅解释前半句:
超时调用的代码都是在全局作用域中执行的
看题,在控制台输出下代码:
var site = "global";
function foo() {
var site = "partial";
setTimeout('alert(site);', 100);
}
foo();
返回什么?
'global'
这就验证了:超时调用的代码都是在全局作用域中执行的;
时间到了,进程空闲的时候, setTimeout 执行的时候,实际上执行的是类似的代码:
var site = "global";
function foo() {
var site = "partial";
// setTimeout(', 100);
}
foo();
alert(site);
这个时候,自然返回的是 ‘global’;
这个时候,如果全局内没有变量 site ,就会报错,这也是常见的错误之一,试试这个:
var s = "global";
function foo() {
var site = "partial";
setTimeout('alert(site);', 100);
}
foo();
Uncaught ReferenceError: site is not defined
原因上面解释过了,如果没有闭包,一般在全局内都是无法访问函数内定义的的局部变量,所以报错很正常,但是这个报错也是可以解决的;
function foo() {
var site = "partial";
setTimeout(function() {
alert(site);
}, 100);
}
foo();
不要用字符串js代码,用函数,这样就没问题,原因是因为
执行 setTimeout 函数代码时,虽然在全局执行,但是 fn 的变量作用域是在 函数定义时 决定的,而不是函数调用时定义的,在 fn 定义时,可以访问到 site,所以在调用时也可以;
而字符串代码,是在执行时才在全局内搜索变量执行,所以全局内找不到就变量会报错;
而且,传递字符串可能导致性能损失,结合上面的易出错,最好不要在 定时器 里传递字符串用作函数,直接传递一个函数会更快更安全。
setTimeout 里 传递字符串代码报错的更多相关文章
- svn 提交代码报错
svn 提交代码报错 最近新安装了TortoiseSvn 1.92,在上传代码,其中有新增加的文件,出现如下错误: 解决方法: 1.用vs生成patch文件 2.生成的patch文件中讲nonexis ...
- pom.xml里有红叉报错的解决办法
pom.xml里有红叉报错的解决办法一: 1.把鼠标点在报的错上发现pom.xml报如下错误: Multiple annotations found at this line: - Failure t ...
- [Git] 拉开发分支的代码报错
Git拉开发分支的代码报错: fatal: The remote end hung up unexpectedly fatal: early EOF fatal: index-pack failed ...
- 普通的jdbc事务在插入数据后 下面的代码报错时 数据不会回滚 但是 spring的事务会回滚
普通的jdbc事务在插入数据后 下面的代码报错时 数据不会回滚 但是 spring的事务会回滚
- git提交代码报错 trailing whitespace的解决方法
1. git提交代码报错 trailing whitespace 禁止执行pre-commit脚本 进入到项目目录中 chmod a-x .git/hooks/pre-commit 2.git提交代码 ...
- Intellij里检出svn报错找不到svn解决办法
Intellij里检出svn报错找不到,解决办法: 1. 安装svn客户端: 2. 去掉settings->version control->subversion里的use command ...
- 如何解决spring boot 项目导入依赖后代码报错问题
如何解决spring boot 项目导入依赖后代码报错问题 2020-08-15 14:17:18 代码截图如图所示(由于本人问题已经解决,没来得及截图,所以在网上找了一张图片)
- CodeIgniter2.2.0-在控制器里调用load失败报错的问题
报错如下: hello A PHP Error was encountered Severity: Notice Message: Undefined property: Test::$load Fi ...
- IDEA在jsp页面写out.print()代码报错
如题,小编以前用myeclipse,eclipse的时候,在jsp里写java代码都是可以的,现在我换成了IDEA,却莫名报错 而且没有代码提示,比如说下图这样的,,虽然运行还是能运行...但对强迫症 ...
随机推荐
- hibernate 中多对多关系对象集合的保存
多对多关系映射和一对多关系映射开发步骤差不多, 例子如下:员工和项目之间的关系,一个员工可以参与多个项目:一个项目可以有多个开发人员参与.因此是多对多的关系. 1 分析数据表 1.1)员工表 CREA ...
- pow(x,y)函数的实现算法(递归函数)
函数pow(x,y)实现运算x^y,即x的y次方,这里x和y都为整数. 算法的基本思想是,减少乘法次数,重复利用结算结果,例如: x^4,如果逐个相乘的话,需要四次乘法.如果我们这样分解(x^2)*( ...
- AESDK从流中获得变换信息
AE中Transform下的信息位于流中,和别的软件不太一样. 如果是特效的参数信息要从EffectSuites中获取,默认的参数信息基本上StreamSuites都可以得到 需要注意,取得流之后也要 ...
- Atitit.ALT+TAB没反应车and 点击任务栏程序闪烁但是不能切换
Atitit.ALT+TAB没反应车and 点击任务栏程序闪烁但是不能切换 1. 可能你的Alt+Tab键被别人禁用了,试下下面的方法: 1 2. 为什么要禁用Alt+Tab 1 3. ALT+TAB ...
- makefile之wildcard函数
$(wildcard PATTERN) 函数功能: 获取匹配 PATTERN 的所有对象 返回值: 使用空格分割的匹配对象列表 1. 示例1
- mysql 索引 大于等于 走不走索引 最左前缀
你可以认为联合索引是闯关游戏的设计 例如你这个联合索引是state/city/zipCode 那么state就是第一关 city是第二关, zipCode就是第三关 你必须匹配了第一关,才能匹配第二关 ...
- 中兴ZXV10 B860AV1.1 全TTL操作完美破解
本文转自:http://www.znds.com/tv-496624-1-1.html 1)前期准备工作 1.1 拆开盒子,TTL接线,这个论坛里有好多其它帖子,就不再详细描述. 1.2 复制需要安装 ...
- xadmin 问题总结
pip install django-import-export
- js 控制不同客户端 访问不同CSS js
function loadCSS(flag) { var t='.css'; if((navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios ...
- malloc,我误解你了
malloc用于动态申请内存,这个学过C语言的都知道.忘记了在哪本书上看到,malloc申请的内存不一定是连续,于是一直记住了.这句话有错吗?没有!但是当时只是记住了这个知识点,而没有深入的思考.直到 ...