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,却莫名报错 而且没有代码提示,比如说下图这样的,,虽然运行还是能运行...但对强迫症 ...
随机推荐
- C++一次指针问题和解决(char指针乱码)
问题始末 struct NameGroup { char* Name1; char* Name2; }; NameGroup A() { NameGroup result; //From other ...
- atitit.激活一个窗口总结 swing java .net php
atitit.激活一个窗口总结 1 激活窗口:鼠标激活vswindows消息激活 1.1 Web框架激活 2 退出激活窗口热键(dbg模式) 3 俩个窗口激活优先级 ...
- [svc]nfs客户端报错解决Stale file handle
NFS故障: 问题背景: 客户端挂载是好的.服务端磁盘满了,重新给挂了一快.客户端df -h 发现nfs挂载消失. 查看目录客户端报错:Stale file handle 现象如下: [root@n1 ...
- UISCREEN 和支持高分辨率的显示屏
UIScreen对象包含了整个屏幕的边界矩形.当构造应用的用户界面接口时,你应该使用该对象的属性来获得推荐的矩形大小,用以构造你的程序窗口. CGRect bound = [[UIScreen mai ...
- vue中config/index.js:配置的详细理解
当我们需要和后台分离部署的时候,必须配置config/index.js: 用vue-cli 自动构建的目录里面 (环境变量及其基本变量的配置) var path = require('path') ...
- 【转】在MAC下配置MySQL 5.7 数据库的编码问题
1.MySQL 5.7 for MAC 默认没有my.cnf文件 ,首先 新建my.cnf文件: 2.在my.cnf文件追加 1 2 3 4 5 6 7 8 [mysqld] character-se ...
- FileInputStream与FileOutputStream类
FileInputStream和FileOutputStream类分别用来创建磁盘文件的输入流和输出流对象,通过它们的构造函数来指定文件路径和文件名. 创建FileInputStream实例对象时,指 ...
- HADOOP 2.6 INSTALLING ON UBUNTU 14.04 (hadoop 2.6 部署到ubuntu 14.04上面)
Hadoop on Ubuntu 14.04 In this chapter, we'll install a single-node Hadoop cluster backed by the Had ...
- 广义线性模型 - Andrew Ng机器学习公开课笔记1.6
在分类问题中我们如果: 他们都是广义线性模型中的一个样例,在理解广义线性模型之前须要先理解指数分布族. 指数分布族(The Exponential Family) 假设一个分布能够用例如以下公式表达, ...
- 使用pjsip传输已经编码的视频
http://blog.chinaunix.net/uid-15063109-id-4445165.html ————————————————————————————————————————————— ...