3

我正在尝试解决其他人的 JavaScript 文件的问题,他们声明了一个如下所示的函数。

function window.confirm(str) {
..... code here .....
}

这适用于 IE,但在 Google Chrome 中,它会在window.confirm. 我试图像下面这样尝试捕获它,但这不起作用,同样的语法错误。然后它不会让我使用该 JavaScript 文件中定义的任何函数。

try {
    var window.confirm = function(str) {
        ..... code here .....
    };
}
catch(e) {}

我还尝试将声明更改为变量,如下所示,但这也不起作用。同样的错误。

var window.confirm = function(str) {
    ..... code here .....
};

有没有办法在 Chrome 中捕捉到这个?

4

4 回答 4

3

两点:

  • try/catch用于检测执行错误,而不是编译错误。不要部署有语法错误的代码。

  • function window.confirm(){是你必须避免的 MS 习语。您可以使用window.confirm = function() {,或者,如果您在全局范围内,只需使用var confirm = function() {.

于 2012-11-07T16:08:08.163 回答
3

function window.confirm(str)并且var window.confirm ...无效。相反,尝试:

window.confirm = function(str){
..... code here .....
}
于 2012-11-07T16:08:45.073 回答
2

如果您绝对需要尝试捕获“Uncaught SyntaxError”错误,那么您将不得不依赖 JavaScript 的隐藏在地板下被误解的继子函数eval()

在下面的示例代码中,obj仅当传入字符串评估为有效对象时才会更新;否则obj将默认为{}. 让我们假设$someTextField拉入在 CMS 文本区域字段中输入的设置,并且内容编辑器在该字段中输入了这个格式错误的字符串:

{
  "foo": "bar
}

示例代码:

var oSettings = {};

// Returns "Uncaught SyntaxError: Unexpected token ILLEGAL(…)"
try {
  oSettings = <?php echo $someTextField ?>;
} catch(e) {}

// This works
try {
  eval('oSettings = <?php echo $someTextField ?>');
} catch(e) {}

请记住,如果要评估的字符串来自某个外部源(例如,CMS),并且您无法像本示例中那样控制它,那么您需要做三件事:

  1. 检测并阻止执行可能会破坏您的应用程序的 JavaScript 代码。

  2. 转义传入字符串中的引号以避免与 JavaScript 引号冲突。由于我们在此示例中使用 PHP,因此最好执行以下操作:

    eval('oSettings = <?php echo addslashes($someTextField) ?>');

  3. 删除换行符,因为评估的字符串需要在一行上。做这样的事情会更好:

    eval('oSettings = <?php echo addslashes(str_replace(array("\r\n", "\n", "\r"), "", $someTextField)) ?>');

于 2016-04-08T09:41:30.747 回答
1

您必须修复语法错误。Try/catch 不会捕获语法错误,因为语法错误是编译时错误,而 try/catch 只能捕获运行时错误。

于 2012-11-07T16:07:52.080 回答