代码求值一共有4种方式:
- eval()函数
- 函数构造器
- 定时器
- <script>元素
一、eval()函数求值
- 该方法将执行传入代码的字符串
- 在调用eval()方法的作用域内进行代码求值
alert(eval('5 + 5')); //10
alert(eval('var ninja = 5;')); //undefined
alert(ninja === 5); //true
(function(){
eval('var ninja = 6;');
alert(ninja === 6); //true
})();
alert(eval('window.ninja === 5')); //true
alert(ninja === 5); //true
应该指出的是,任何不是简单变量、原始值、赋值语句的内容都需要在外面包装一个括号,以便返回正确结果。
比如用eval创建一个对象:
var o = eval('({ninja:1})');
另外,用eval()创建函数,如果在IE8或之前的版本的浏览器运行可能会有一个令人惊讶的结果。我们要迫使使用布尔表达式,才能让eval()进行正确的调用。
var fn = eval('false || function(){return true;}'); alert(fn() === true); //true
二、函数构造器求值:
var add = new Function('a','b','return a+b;'); alert(add(3,4)); //7
三、定时器求值:
var tick = window.setTimeout(alert('Hi!'),100);
四、全局作用域内的求值操作
<script type="text/javascript">
//定义一个全局eval函数
function globalEval(data){
//去除字符串中的所有前导和尾部的空白字符
data = data.replace(/^\s*|\s*$/g,'');
if(data){
var head = document.getElementsByTagName('head')[0] || document.documentElement,
script = document.createElement('script'); //创建一个script节点
script.type = 'text/javascript';
script.text = data;
//将script节点附加到DOM上
head.appendChild(script);
//再去除它
head.removeChild(script);
}
}
window.onload = function(){
(function(){
globalEval('var test = 5;');
})();
alert(test === 5);
}
</script>
上述代码出人意料的简单。在eval()方法中,我们定义了一个名为globalEval()的函数,以便在全局作用域内求值任何想要求值的内容。
浙公网安备 33010602011771号