对setTimeout()第一个参数是字串的深入理解以及eval函数的理解

1 <script language="javascript" type="text/javascript">
2   var a=1;
3   setTimeout(‘var a=2;alert(a)‘, 1000);
4   alert(a);
5   setTimeout(‘alert(a)‘,1000);
6 </script>//1 2 1;

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

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

1  <script language="javascript" type="text/javascript">
2      var a=1;
3      setTimeout(function(){var a=2;alert(a);}, 1000);
4      alert(a);
5      setTimeout(function(){alert(a);},1000);
6 </script>
7 //1 2 1;
1 <script language="javascript" type="text/javascript">
2     var a=1;
3     new Function(‘var a=2;alert(a);‘);
4     alert(a);
5     new Function(‘alert(a);‘);
6 </script>
7 //1 2 1;

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

1 <script language="javascript" type="text/javascript">
2     var a=1;
3     eval(‘var a=2;alert(a)‘);
4     alert(a);
5     setTimeout(‘alert(a)‘,1000);
6 </script>  //2 2 2;

eval函数会把里面的字串直接定义到全局,不会向setTimeout和new Function那样会在一个闭包函数中去定义,所以eval函数不但会出现xss攻击的危险,还会存在全局变量污染的问题,所以我们要尽量减少多eval的使用,当有时候万不得已不需用到的时候,我们用new Function去代替eval也是可行的

时间: 2025-01-12 16:01:02

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

通过操作指针,与指针做函数参数&#39;实现字串在主串中出现的次数,然后将出现的部分按照要求进行替换

#include<stdio.h> #include<stdlib.h> int strTime(const char *str1, const char *str2, int *time) { int count = 0; char *p1 = str1; char *p2 = str2; //p1是第一次出现的位置 p1 = strstr(p1, p2); //注意这里不要写成*p1!=NULL 因为p1 是null的地址一旦读取*p1 会出错的!!!!不能读取操作系统的数据

setTimeout 第一个参数类型

读别人代码的时候看到这么一段,很不理解,然后就搜了一下百度 setTimeout / setInterval 第一个参数可以有三种类型: 字符串   .  methods  .  匿名函数 1.字符串 for (var i = 0, l = aLi.length; i < l; i++) { if (true) { setTimeout("setImg(" + i + ")", 500); } } 这里setImg函数作为字符串传递,不是特别理解,汗颜!! 2

java字串加密及String的各类函数说明

一.字串加密 古罗马皇帝凯撒在打仗时曾经使用过以下方法加密军事情报: 请编写一个程序,使用上述算法加密或解密用户输入的英文字串要求设计思想.程序流程图.源代码.结果截图. 1.程序设计思想 先定义字符串,之后输入字符串,算出字符串的长度,用for循环进行字符串的加密,运用ASCLL码表,进行加密,如果是xyz就减23,XYZ同理,其余的就正常加3,最后将加密的字符加到一个空的String类型的成员上,最后输出结果. 2.程序流程图 3.源代码 import java.util.Scanner;

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

@有两个含义:1,在参数里,以表明该变量为伪参数 ,在本例中下文里将用@name变量代入当前代码中 2,在字串中,@的意思就是后面的字串以它原本的含义显示,如果不加@那么需要用一些转义符\来显示一些特殊字符 举例1:(2) stringsql ="update Table1 set name [email protected] where ID = '1'";//未采用SqlParameter SqlParameter sp =newSqlParameter("@name&q

字串比较函数 strcmp

//重点在于函数中需要手动push一些寄存器, 且以ebp为基址计算参数的地址. #include "stdafx.h" __declspec(naked) int strcmpA(char *s1, char *s2)    //__declspec(naked) 不用编译器自动附带各种push ebp pop ebp等语句 { __asm { push ebp mov ebp, esp push edi push esi xor al, al mov edi, dword ptr

华为机试-公共字串计算

题目描述题目标题:计算两个字符串的最大公共字串的长度,字符不区分大小写详细描述:接口说明原型:int getCommonStrLength(char * pFirstStr, char * pSecondStr);输入参数: char * pFirstStr //第一个字符串 char * pSecondStr//第二个字符串 输入描述:输入两个字符串 输出描述:输出一个整数 输入例子:asdfas werasdfaswer 输出例子:6 效率低的Java程序实现: import java.ut

华为OJ——公共字串计算

题目描述 题目标题: 计算两个字符串的最大公共字串的长度,字符不区分大小写 详细描述: 接口说明 原型: int getCommonStrLength(char * pFirstStr, char * pSecondStr); 输入参数: char * pFirstStr //第一个字符串 char * pSecondStr//第二个字符串 输入描述: 输入两个字符串 输出描述: 输出一个整数 输入例子: asdfas werasdfaswer 输出例子: 6 import java.util.

POJ - 2406 ~SPOJ - REPEATS~POJ - 3693 后缀数组求解重复字串问题

POJ - 2406 题意: 给出一个字符串,要把它写成(x)n的形式,问n的最大值. 这题是求整个串的重复次数,不是重复最多次数的字串 这题很容易想到用KMP求最小循环节就没了,但是后缀数组也能写 后缀数组写法放在后面那一题,SPOJ - REPEATS是求子串类型,KMP就不好处理了 这里放下处理KMP的AC代码: 1 #include <cstdio> 2 #include <cstring> 3 #include <queue> 4 #include <c

setTimeout与setInterval参数之String

今天无意中给某网友解答了一些setTimeout的问题,发现一个有趣的东西. 以前我总认为setTimeout的第一个参数只能function,后面发现string也能执行.那问题来了,String做参数,使用的是哪个域? function trace(){ console.log("out"); } function test(){ function trace(){ console.log("in"); } setInterval("trace()&q