2013-11-27 34 views
2
<!DOCTYPE html> 
<html lang="en" xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <meta charset="utf-8"> 
    <title>chap07</title> 
    <script> 
    function make_a_matcher(){ 
     return /a/gi; 
    } 

    var x = make_a_matcher(); 
    var y = make_a_matcher(); 

    x.lastIndex = 10; 

    document.writeln('<div>x.global : '+x.global+'<div>'); 
    document.writeln('<div>x.ignoreCase : '+x.ignoreCase+'<div>'); 
    document.writeln('<div>x.lastIndex : '+x.lastIndex+'<div>'); 
    document.writeln('<div>x.multiline : '+x.multiline+'<div>'); 
    document.writeln('<div>x.source : '+x.source+'<div>'); 

    document.writeln('<div>y.global : '+y.global+'<div>'); 
    document.writeln('<div>y.ignoreCase : '+y.ignoreCase+'<div>'); 
    document.writeln('<div>y.lastIndex : '+y.lastIndex+'<div>'); 
    document.writeln('<div>y.multiline : '+y.multiline+'<div>'); 
    document.writeln('<div>y.source : '+y.source+'<div>'); 
    </script> 
</head> 
<body> 
</body> 
</html> 

我正在學習由Douglas Crockford編寫的「JavaScript The Good Parts」的JavaScript。 他描述了由正則表達式文字創建的RegExp對象共享單個實例和上面的示例。由正則表達式文字創建的RegExp對象共享單個實例?

該書的結果是y.lastIndex : 10。但我的結果是y.lastIndex : 0

如果你告訴我這個不同結果的確切原因,我將不勝感激。

+2

我認爲Crockford的信息已過時。在現代瀏覽器中,您將獲得單獨的實例。 (試試看_console.log(x === y)_) – nnnnnn

+0

你確定他不是在談論'RegExp'函數對象,它有一些在所有正則表達式實例中共享的屬性? –

+0

非常感謝。 – user2952980

回答

0

Crockford的信息不正確(或不是最新的),任何簡單的測試都會驗證您每次調用函數時都會得到一個新的不同的對象。

如果你希望他們返回相同的對象,你可以這樣做:

var make_a_matcher = (function() { 
    var regex = /a/gi; 
    return function() { 
     return regex; 
    } 
})(); 

演示:http://jsfiddle.net/jfriend00/FaDwP/

+0

非常感謝你 – user2952980

0

this SO question和它的答案。特別是其中一個答案引用ECMA-262屬,§7.8.5正則表達式字面,其中指出:

正則表達式文本是被轉換爲正則表達式對象的輸入元件(見15.10)每次文字被評估。

所以每次調用函數make_a_matcher時都會創建一個新的正則表達式對象。看起來克羅克福德先生的書可能會過時,如果它另有說明。

+0

非常感謝你 – user2952980

0

當你做到這一點,

function make_a_matcher(){ 
    return /a/gi; 
} 

var x = make_a_matcher(); 
var y = make_a_matcher(); 

要創建單獨的實例。這是一樣的:

function make_a_matcher(){ 
    return new RegExp('a', 'gi'); 
} 

如果您在創建make_a_matcher()之前創建的實例,它應該工作,

var agi = /a/gi; 
function make_a_matcher(){ 
    return agi; 
} 

雖然就沒有必要,因爲你可以只使用該變量。

+0

非常感謝你。 – user2952980

0

在我的電腦裏,y也等於0; 因爲make_a_matcher函數返回一個名爲RegExp對象的對象,而x,y是RegExp對象的不同實例,這意味着x,y是分開的!

function make_a_matcher() { 
return /a/gi; 
} 
var x = make_a_matcher(); 
var y = make_a_matcher(); 
x.lastIndex = 10; 
console.log(y.lastIndex); 

enter image description here

在後續的圖片中我們可以看到,x,y是正則表達式的不同實例,但不等於。 enter image description here

相關問題