Tôi có đoạn mã này:JavaScript biểu thức chính quy vẫn tồn tại theo nghĩa đen giữa chức năng gọi
function func1(text) {
var pattern = /([\s\S]*?)(\<\?(?:attrib |if |else-if |else|end-if|search |for |end-for)[\s\S]*?\?\>)/g;
var result;
while (result = pattern.exec(text)) {
if (some condition) {
throw new Error('failed');
}
...
}
}
này hoạt động, trừ trường hợp tuyên bố ném được thực thi. Trong trường hợp đó, lần sau tôi gọi hàm, lệnh exec() bắt đầu từ khi nó dừng lại, mặc dù tôi đang cung cấp nó với một giá trị mới của 'văn bản'.
Tôi có thể sửa lỗi bằng cách viết
var pattern = new RegExp ('.....');
thay vào đó, nhưng tôi không hiểu tại sao phiên bản đầu tiên bị lỗi. Biểu thức chính quy tồn tại như thế nào giữa các cuộc gọi hàm? (Điều này đang xảy ra trong các phiên bản mới nhất của Firefox và Chrome.)
Sửa Hoàn thành kiểm tra trường hợp:
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-type" content="text/html;charset=UTF-8">
<title>Test Page</title>
<style type='text/css'>
body {
font-family: sans-serif;
}
#log p {
margin: 0;
padding: 0;
}
</style>
<script type='text/javascript'>
function func1(text, count) {
var pattern = /(one|two|three|four|five|six|seven|eight)/g;
log("func1");
var result;
while (result = pattern.exec(text)) {
log("result[0] = " + result[0] + ", pattern.index = " + pattern.index);
if (--count <= 0) {
throw "Error";
}
}
}
function go() {
try { func1("one two three four five six seven eight", 3); } catch (e) { }
try { func1("one two three four five six seven eight", 2); } catch (e) { }
try { func1("one two three four five six seven eight", 99); } catch (e) { }
try { func1("one two three four five six seven eight", 2); } catch (e) { }
}
function log(msg) {
var log = document.getElementById('log');
var p = document.createElement('p');
p.innerHTML = msg;
log.appendChild(p);
}
</script>
</head>
<body><div>
<input type='button' id='btnGo' value='Go' onclick='go();'>
<hr>
<div id='log'></div>
</div></body>
</html>
Các biểu hiện thường xuyên tiếp tục với 'bốn' như các cuộc gọi thứ hai trên FF và Chrome, không phải trên IE7 hoặc Opera.
Tôi đã tự do đăng một bài kiểm tra đầy đủ, đơn giản, hy vọng bạn không phiền. Tôi đã nhìn thấy hành vi này là tốt và tự hỏi tại sao nó sẽ được. Nó trông và có mùi giống như một con bọ, nhưng sau đó, đôi khi mọi thứ rất tinh tế, và thật đáng ngạc nhiên khi cả FF và Chrome sẽ có nó cho các công cụ Javascript hoàn toàn khác nhau của họ *. –
Chỉ cần rõ ràng, nó hoạt động miễn là lỗi/ngoại lệ không được ném, nhưng nếu 'một số điều kiện' trở thành sự thật và ngoại lệ được ném, thì hàm sẽ thất bại trong lời gọi tiếp theo vì mẫu tiếp tục từ đó ngoại lệ đã được ném? Điều đó chắc chắn giống như một con bọ không nằm trong tầm tay bạn. – PatrikAkerstrand