zoukankan      html  css  js  c++  java
  • 运行时代码求值

    代码求值一共有4种方式:

    1. eval()函数
    2. 函数构造器
    3. 定时器
    4. <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()的函数,以便在全局作用域内求值任何想要求值的内容。

  • 相关阅读:
    uniapp的v-for的key不同平台的兼容解决
    想好要做什么,然后就放手去做吧!
    中国姓氏大全(常见508个,罕见740个)
    swiper鼠标移入停止滚动 移出开始滚动
    swiper文字垂直滚动(公告栏)
    简体生僻汉字大全21418个-GBK编码中的汉字
    uniapp终极查bug大法-无私分享
    uniapp数据更新了但是页面没有渲染-解决方案
    uniapp引入font-awsome字体图标-疑难解决
    优化问题及KKT条件
  • 原文地址:https://www.cnblogs.com/gongshunkai/p/6698523.html
Copyright © 2011-2022 走看看