JavaScript如何';实施的严格模式

JavaScript如何';实施的严格模式,javascript,recursion,strict,Javascript,Recursion,Strict,更新: 函数的调用方式可能是罪魁祸首,因此,以下是原因: 2 JS filesMain.JS:自调用(非严格)函数,为“(on)load”事件添加事件侦听器回调调用一个加载函数,该函数解析location.pathname,调用一个init函数,分离/删除“(on)load”侦听器并(显式)返回null。 PageSpecific.js:包含_init函数,在主体中添加了两个事件侦听器 其中一个侦听器的回调(也从闭包返回)调用使用argument.callee作为递归引用的strict函数返回

更新:

函数的调用方式可能是罪魁祸首,因此,以下是原因:

2 JS files
Main.JS:自调用(非严格)函数,为“(on)load”事件添加事件侦听器
回调调用一个加载函数,该函数解析location.pathname,调用一个init函数,分离/删除“(on)load”侦听器并(显式)返回null。

PageSpecific.js:包含_init函数,在主体中添加了两个事件侦听器
其中一个侦听器的回调(也从闭包返回)调用使用argument.callee作为递归引用的strict函数
返回事件处理程序的闭包可能(取决于浏览器)也可能不绑定和解除绑定其他事件,但我认为这与此无关,因为这是为了模拟IE eventlistener中的onchange事件
=>处理程序(命名但在anon F中声明)=>pageloader=>
init=>eventListener
闭包返回的绑定函数调用严格函数

顺便说一句:这就是所谓的,我实际上正在使用的。更具体地说:将事件侦听器和-处理程序绑定在一起的闭包。这是我的另一个冗长的问题,似乎没有人知道答案。。。提示;-)


我正在调试一些相当大(复杂)的Java脚本。在这样做的过程中,我注意到我有一个函数,使用strict模式,可以很好地工作,但如果我没有弄错的话,应该抛出错误。由于脚本相当大且复杂(事件委派、堆叠闭包等),下面是一个简单的示例:

function withCalleeRecursion(foo)
{
    'use strict';//strict throws typeError on arguments.callee
    foo = foo.replace(/(a|b)+/gi, function (p1,p2)
    {
        if (p1.match(/(a|b){2,}/i))
        {
            return p1.replace(/(a|b)/gi,arguments.callee);//no errors
        }
        return (p2.match(/a/i) ? 'X':'Y');
    });
    return foo;
}

(function()
{//not strict
    alert(withCalleeRecursion('Abba makes me barf'));
})();
在我的实际剧本中,这个效果非常好。不过,当我在Firebug和chrome控制台中粘贴此内容时,会抛出一个错误。我已经尝试过这段代码,所以IE也应该抛出错误,但是当我在IE的调试器中运行代码时,它运行得很好。据我所知,更改doctype(尝试了html5和html4)没有什么区别

我认为(大多数)浏览器对
“use strict”的要求不那么严格,对吗指令,顾名思义?当解析脚本时检测到可能的错误时,浏览器似乎会选择忽略它。这是真的吗


同时,为了预防起见,我对函数做了一点小小的更改。因为我在这里看到了很多问题,人们想知道如何在严格模式下获取
被调用方
引用,所以我也将其粘贴到这里:

function withCalleeRecursion(foo)
{
    'use strict';
    foo = foo.replace(/(a|b)+/gi, function abR(p1,p2)
    {
        if (p1.match(/(a|b){2,}/i))
        {
            return p1.replace(/(a|b)/gi,abR);
        }
        return (p2.match(/a/i) ? 'X':'Y');
    });
    return foo;
}

命名回调,仅此而已。

也许这篇文章可以帮助您了解更多。无论如何,解决方案就是您提到的那个,错误是因为访问arguments.caller和arguments.callee会在严格模式下引发异常。因此,您要引用的任何匿名函数都需要命名。

这可能是因为浏览器控制台使用
eval()
,这会改变一些事情。虽然把
放在“严格使用”
在传递给
eval()
的代码字符串的开头,控制台实现可能会将代码预先添加到您在控制台中键入的字符串中,这意味着
“使用严格”不再是执行的第一条语句,因此被忽略

在下面的文章中有对这一点的参考和建议的解决方法:

建议的解决方法是将控制台中的代码包装到立即执行的函数中:

(function() {
    "use strict";
    nonExistentVariable = 1; // Error is now thrown
})();

From—“早于Internet Explorer 10的Internet Explorer版本不支持严格模式。”您认为
参数是正确的。但被调用方
应在严格模式下抛出错误。严格模式实现的思想是,
语句“use Strict”在一个不支持的浏览器中将是完全无害的。足够公平,我认为同样。。。不过,该脚本也可以在FF和chrome中使用。这两个最新版本都支持
严格模式
@EliasVanOotegem-Chrome在我运行时抛出预期的TypeError。我也设置了一个fiddle,在那里我也得到了错误。我在那里尝试了所有的doctype,每次都出现错误。也许它与调用堆栈有关?我将更新这个问题,给出函数调用方式的示意图。我刚才已经读过那篇文章了。我的问题不是为什么抛出错误,而是为什么不抛出错误。不在IE中,不在FF中,不在chrome中…我已经这样做了,但我想我的问题还不清楚:错误是在控制台(FF和chrome)中抛出的,而不是在使用该功能的页面上!在实际脚本中调用该函数时,我可以
alert()
console.log()
,并使用
参数。被调用方
就像
使用strict'不在那里。上面的代码在任何地方都能工作(我的意思是:它不能),但在我的脚本中不行itself@EliasVanOotegem:啊,对不起,我想我没有把问题读清楚。