<script language="javascript" type="text/javascript">
  var a=1;
  setTimeout('var a=2;alert(a)', 1000);
  alert(a);
  setTimeout('alert(a)',1000);
</script>
//1 2 1;

setTimeout的异步我这里就不做过多的解释(异步回调,事件队列相关知识),主要写一下对一个参数是字串的时候注意的地方

从上面的代码中我们可以看出来,setTimeout的第一个参数为字串的时候,其实它相当于new 了一个Function在Function里面去定义的a变量,相当于:

  <script language="javascript" type="text/javascript">
var a=1;
setTimeout(function(){var a=2;alert(a);}, 1000);
alert(a);
setTimeout(function(){alert(a);},1000);
</script>
//1 2 1;
 <script language="javascript" type="text/javascript">
var a=1;
(new Function('var a=2;alert(a);')());
alert(a);
(new Function('alert(a);')());
</script>
//2 1 1

不知道为什么网上太多的人在说setTimeout/setInterval的时候都说污染全局变量,我感觉没污染全局变量啊,只是作用域的问题,就像下面的两个例子

另外我们在使用setTimeout的时候一般还是不要第一个参数传字串:

 function outer1(){
function inner1(){
setTimeout("inner2()",1000);
setTimeout("outer2()",1000);
alert("use inner1")
}
function inner2(){
alert("use inner2")
}
inner1();
}
outer1();
function outer2(){
alert("use outer2")
}
//use inner1,use outer2
 function outer1(){
function inner1(){
setTimeout(inner2(),1000);
setTimeout(outer2(),1000);
alert("use inner1")
}
function inner2(){
alert("use inner2")
}
inner1();
}
outer1();
function outer2(){
alert("use outer2")
}
//use inner1,use inner2,use outer2

对于第一个参数传字串来说,会在匿名函数中执行字串内容,这是就只能访问匿名函数体内定义的函数和变量或全局的变量和函数,所以出现了上面的结果。

再看一个例子:

 function A() {
setTimeout("var a=2;alert(a)", 1000);
}
A();
alert(a);//a is not define
==============================================
function A() {
setTimeout("var a=2;alert(a)", 1000);
alert(a);//a is not define
}
A();
============================================
function A() {
eval("var a=2;alert(a)", 1000);
alert(a);//
}
A();
============================================
function A() {eval("var a=2;alert(a)", 1000);}
A();
alert(a);//a is not define
============================================
function A() {window.eval("var a=2;alert(a)", 1000);}
A();
alert(a);//
============================================
function A() {window.eval("var a=2;alert(a)", 1000);alert(a);//a is not define}
A();

但是对于eval函数来说就不是这样的了

 <script language="javascript" type="text/javascript">
var a=1;
eval('var a=2;alert(a)');
alert(a);
setTimeout('alert(a)',1000);
</script>
//2 2 2;

eval函数会把里面的字串直接定义到当前作用域(当前执行的上下文)后面有提到window.eval和eval的区别是window.eval直接定义到作用域链的最顶端window下,不会向setTimeout和new Function那样会在一个闭包函数中去定义,所以eval函数不但会出现xss攻击的危险,还会存在变量污染的问题,所以我们要尽量减少多eval的使用,当有时候万不得已不需用到的时候,我们用new Function去代替eval也是可行的

当让这样也可以:

<script language="javascript" type="text/javascript">
var a=1;
(function foo() {
eval('var a=2;alert(a);');
})();
alert(a);
setTimeout('alert(a)',1000);
</script>
//2 1 1;

最后还有一个需要注意的地方是:在版本号1.7以上的SpiderMonkey(内置于Firefox,Thunderbird)的实现中(这个是FF的ECMAScript解析引擎,相应的chrome V8,ie的JScript),可以把调用上下文作为第二个参数传递给eval。那么,如果这个上下文存在,就有可能影响“私有”(有人喜欢这样叫它)变量(这一段转自汤姆大叔blog)。

function foo() {
var x = 1;
return function () { alert(x); };
};
var bar = foo();
bar(); // 1
eval('x = 2', bar); // 传入上下文,影响了内部的var x 变量
bar(); // 2
 最后一个非常值得注意的地方是eval既是ECMAScript的关键字有时window的一个属性,在运用的时候要注意以下的问题:
 function test(){
eval('var a=10;')
alert(a);//
}
test();
--------------------------------------------------------------------
function test(){
eval('var a=10;')
}
test();
alert(a);//a is not defined
--------------------------------------------------------------------
function test(){
window.eval('var a=10;')
}
test();
alert(a);//
--------------------------------------------------------------------
function test(){
var val=eval;
val('var a=10;')
}
test();
alert(a);//

对setTimeout()第一个参数是字串的深入理解以及eval函数的理解的更多相关文章

  1. setTimeout 第一个参数类型

    读别人代码的时候看到这么一段,很不理解,然后就搜了一下百度 setTimeout / setInterval 第一个参数可以有三种类型: 字符串   .  methods  .  匿名函数 1.字符串 ...

  2. python-Levenshtein几个计算字串相似度的函数解析

    linux环境下,没有首先安装python_Levenshtein,用法如下: 重点介绍几个该包中的几个计算字串相似度的几个函数实现. 1. Levenshtein.hamming(str1, str ...

  3. @有两个含义:1,在参数里,以表明该变量为伪参数 ,在本例中下文里将用@name变量代入当前代码中2,在字串中,@的意思就是后面的字串以它原本的含义显示,如果不

    @有两个含义:1,在参数里,以表明该变量为伪参数 ,在本例中下文里将用@name变量代入当前代码中 2,在字串中,@的意思就是后面的字串以它原本的含义显示,如果不加@那么需要用一些转义符\来显示一些特 ...

  4. JS的setTimeout函数第一个参数问题

    setTimeout的第一个参数只能放一个无参的函数,更像放了一个函数指针在那里,如果要放带参数的话,就要拿个匿名函数包裹一下

  5. setTimeout中第一个参数

    永远不要传递字符串作为setTimeout的第一个参数!!!记住第一个参数只允许函数,或者匿名函数!因为传递字符串有陷阱啊!!它就是披着羊皮的eval啊!!而且上下文会变成全局啊!! 第一个参数为可执 ...

  6. 编程:使用递归方式判断某个字串是否回文(Palindrome)

    Answer: import java.util.Scanner; public class Palindrome { private static int len;//全局变量整型数据 privat ...

  7. 字串符相关 split() 字串符分隔 substring() 提取字符串 substr()提取指定数目的字符 parseInt() 函数可解析一个字符串,并返回一个整数。

    split() 方法将字符串分割为字符串数组,并返回此数组. stringObject.split(separator,limit) 我们将按照不同的方式来分割字符串: 使用指定符号分割字符串,代码如 ...

  8. [洛谷P1032] 字串变换

    洛谷题目链接:字串变换 题目描述 已知有两个字串 A, B 及一组字串变换的规则(至多6个规则): A1 -> B1 A2 -> B2 规则的含义为:在 A$中的子串 A1 可以变换为 B ...

  9. POJ - 2774~POJ - 3415 后缀数组求解公共字串问题

    POJ - 2774: 题意: 求解A,B串的最长公共字串 (摘自罗穗骞的国家集训队论文): 算法分析: 字符串的任何一个子串都是这个字符串的某个后缀的前缀. 求 A 和 B 的最长 公共子串等价于求 ...

随机推荐

  1. PICT实现组合测试用例(二)

    上次简单总结了PICT命令的一些用法,这次重新把<软件测试实战>里面有关这一章的内容再总结一次,以巩固理解. 组合测试的概念 组合测试(combinatorial testing)是一种测 ...

  2. 自动化测试(二):QTP验证点

    1 程序自带验证点 自带验证点:图形界面insert  ->  checkpoint Standard Checkpoint 标准验证:用于检查测试对象的属性 Text Checkpoint 文 ...

  3. SimpleHttpServer的学习之UML

    如何分析一个稍微大点的源码呢? 静态分析 除了看代码,就是 uml图,UML虽然在书本类与类之间的关系很复杂,可能要一本书,但是最核心的其实很简单: (1)继承 extends (2)实现接口 imp ...

  4. input子系统 KeyPad-Touch上报数据格式与机制

    -----------------------------------------------------------------------本文系本站原创,欢迎转载!转载请注明出处:http://b ...

  5. [九度OJ]1113.二叉树(求完全二叉树任意结点所在子树的结点数)

    原题链接:http://ac.jobdu.com/problem.php?pid=1113 题目描述: 如上所示,由正整数1,2,3……组成了一颗特殊二叉树.我们已知这个二叉树的最后一个结点是n.现在 ...

  6. javascript设计模式8

    桥接模式(将抽象与其实现隔离开来,以便二者独立变化) function sendInfo(element){ var id=element.id; ajax("GET"," ...

  7. Docker系列(九)Kubernetes安装

    环境: A.B两天机器A机器IP:192.169.0.104,B机器IP:192.168.0.102,其中A为Master节点,B为Slave节点 操作系统:Centos7 Master与Slave节 ...

  8. WEB开发总结(持续更新。。。)

    近期开始搞搞web的东西,觉得有必要把遇到的问题总结一下,就在这里当做个笔记本吧. 1.用maven建立的web工程,在运行的时候,右键找不到“Run on server”菜单: 可以在命令提示行中, ...

  9. 一张图读懂Java多线程

    1.带着疑问看图 1)竞争对象的锁和竞争CPU资源以及竞争被唤醒 2)何种情况下获取到了锁,何种情况下会释放锁 2.还是那张图 3.详细图解 1)Thread t = new Thread(),初始化 ...

  10. 函数 stat() 详解

    先看看MSDN的解釋: stat(): Get status information on a file. Parameters:     path:  pointer to a string con ...