代码之家  ›  专栏  ›  技术社区  ›  mck89

javascript检查收益支持

  •  28
  • mck89  · 技术社区  · 14 年前

    我在javascript中读到了yield关键字,我需要在我的项目中使用它。我读到这个关键字是从JS的某个版本开始实现的,所以我认为旧的浏览器不支持它(对吗?).

    是否有方法检查是否支持yield关键字?或者至少有一种方法可以检查JS的版本是否大于或等于实现该关键字的版本(1.7)?

    7 回复  |  直到 14 年前
        1
  •  33
  •   Darko    12 年前

    这里有一个函数用于检查是否可以使用产量。

    var can_yield = (function(){ 
        try { 
            return eval("!!Function('yield true;')().next()"); 
        } 
        catch(e) { 
            return false; 
        } 
    })();
    
        2
  •  14
  •   bobince    14 年前

    yield 为javascript引入新语法。你将无法使用 产量 除非您已指定要使用新的javascript语法,否则在 script type 属性(*)。

    指定脚本版本时,只有支持给定版本的浏览器才会执行该块。因此,只有Firefox,而不是IE、Opera或Webkit,才能在以下位置执行顶块:

    <script type="text/javascript;version=1.7">
        function x() {
            yield 0;
        }
        var canyield= true;
    </script>
    <script type="text/javascript">
        if (!window.canyield) {
            // do some fallback for other browsers
        }
    </script>
    

    (*:请注意,在 type 属性专门确定是否提取、执行外部脚本以及执行模式。这个 Content-Type 不幸的是,完全忽略了脚本。)

        3
  •  9
  •   SavoryBytes    11 年前

    下面是我对native的检查。 yield support.

    var canyield=(function()try yield;catch(e)())!==未定义;
    < /代码> 
    
    

    现代化测试

    define(['modernizer'],function(modernizer)]{
    //本地产量支持。
    modernizer.addtest('yield',(function()try yield;catch(e)())!=未定义的;
    (});
    < /代码> 
    
    

    性能 http://jspef.com/yield支持

    var canYield = (function(){try{yield;}catch(e){}}())!==undefined;

    现代试验

    define(['Modernizr'], function( Modernizr ) {
      // native yield support.
      Modernizr.addTest('yield', (function(){try{yield;}catch(e){}}())!==undefined);
    });
    

    性能 http://jsperf.com/yield-support enter image description here enter image description here

        4
  •  6
  •   Dancrumb    14 年前

    严格来说,只有Mozilla浏览器支持JavaScript。所有浏览器 应该 支持ecmascript和旧版本的javascript是ecmascript的实现。

    This site 列出哪些版本的浏览器支持哪些版本的javascript。

    MSIE使用JScript。JScript中没有yield。因此,使用yield将限制对页面的浏览器支持。

    尝试 https://developer.mozilla.org/en/New_in_JavaScript_1.7 有关使用javascript 1.7的信息

        5
  •  4
  •   John McDonald    9 年前

    我花了很多时间 yield 最近,Bobine并没有完全错,但Chrome31没有将javascript版本解释为1.7块,即使打开了实验性的javascript标志(chrome://flags/启用javascript和谐)。由于chrome 31和firefox的实现不同,tymon-sturgeon的方法无法检测到 产量 在Chrome31中,虽然已经非常接近了,但仍使用了实验JS。经过一些修改,它可以检测到 产量 适用于Firefox和Chrome31,开启了实验JS。

    首先,我会很快覆盖 产量 差异(为了清晰起见,写得很长):

    在Firefox中:

    var fooGen = function(){ yield 1; yield 2; };
    var iterator = fooGen();
    console.log(iterator.next());    // prints 1
    console.log(iterator.next());    // prints 2
    

    在启用了实验性javascript的Chrome31中:

    // Note the *
    var fooGen = function*(){ yield 1; yield 2; };
    var iterator = fooGen();
    console.log(iterator.next().value);    // prints 1
    console.log(iterator.next().value);    // prints 2
    

    .value 在chrome中是必需的,因为它生成一个对象,但更重要的是,生成器在函数定义中需要一个“*”。此外,我也找不到一种从大写“F”函数创建生成器的方法: new Function('', '{yield 5;}'); 在铬合金中。如果你知道怎么做,请在下面留言。

    正确检测 产量 在Firefox和Chrome中,我使用了一些前后颠倒的代码:

    <script type="application/javascript">
        var can_yield = (function(){ 
            try {
                // Assuming Chrome's generator syntax
                var funcUsingYield = new Function('', '{ var interp = function* generator(){ yield true; }}');
                return true;
            } catch(e) { 
                return false; 
            } 
        })();
    </script>
    
    <script type="application/javascript;version=1.7">
        // Redefine the `can_yield` function inside a JS1.7 block. Probably safe to simply return true
        can_yield = (function(){ 
            try { 
                return eval("!!Function('yield true;')().next()"); 
            } 
            catch(e) { 
                return false; 
            } 
        })();
    </script>
    
    <script type="application/javascript">
        if(!can_yield)
        {
            alert("Can't Yield!");
        }
    </script>
    

    试验地点:

    • 火狐25 : 产量 作品
    • 铬31 使用实验JS : 产量 作品
    • 铬31 使用实验JS 下车 : 产量 不工作
    • IE10 以下内容: 产量 不工作
        6
  •  2
  •   lkcl    13 年前

    在注意到skulpt也做了同样的事情之后,我们实际上用“纯javascript”(即不使用火狐“yield”)编程实现了睡衣的“yield”。

    从理论上讲,完全相同的事情可以手动完成(即,通过遵循如何将函数转换为生成器的规则对翻译后的函数进行费力的手工编码),也可以通过从javascript到javascript的语言转换程序运行javascript(!)

    实现这样一个“野兽”需要的是,您必须使函数能够跳到最后一个“退出”的点(通过yield语句)。因此,所有变量都必须以临时状态存储!!)代码执行也相应地改变了,以接受这个临时状态信息。这包括while语句、for循环语句和if语句。

    可以 完成…

    ……但这只是一个差劲的工作:你需要有效地编写一个完整的编译器来解析任何javascript程序,然后“转换”它,然后输出修改过的javascript。

    L.

        7
  •  1
  •   shabunc    13 年前

    嗯,实际上你可以使用一些技术,但我怀疑这些技术是否有真正的价值

    (function test_key_word(keyword){
    var wrong = false;
    try {
        eval(keyword + "=42");
    } 
    catch(e) {
        wrong = true;
    } finally {
        if (wrong) { return "definitely wrong" }
        else 
        if (window[keyword] !== 42) {
            return "very probably, wrong"
        }
        else {
            return "can be acceptable, but nevertheless i wouldn't rely upon such tests"
        }
    }})("in")