1
我想實現一個算法,我發現在C#中的JavaScript中,並面臨一些問題。將C#移植到JavaScript導致範圍問題
基本上我發現很難在JS中通過引用傳遞。我已經破裂的問題,我有以下示例代碼,讓說你有下面的C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
wordPoco[] myArray = new wordPoco[4] {
new wordPoco {word="This"},
new wordPoco {word="is"},
new wordPoco {word="a"},
new wordPoco {word="test"}};
Console.WriteLine("Values Before Recursion");
MyRecursiveFunction(ref myArray);
Console.Read();
}
private static void MyRecursiveFunction(ref wordPoco[] myArray)
{
if (myArray.Length <= 0) {
Console.WriteLine();
Console.WriteLine("Values After Recursion");
return;
}
wordPoco[] newArray = (wordPoco[])myArray.Clone();
Console.Write("ArrayValue: ");
for (int j = 0; j < newArray.Length; j++)
{
Console.Write(newArray[j].word + " ");
}
Console.WriteLine();
//popping in js
wordPoco[] poppedArray = new wordPoco[newArray.Length - 1];
Array.Copy(newArray, poppedArray, newArray.Length - 1);
newArray = (wordPoco[])poppedArray.Clone();
MyRecursiveFunction(ref newArray);
myArray = (wordPoco[])newArray.Clone();
Console.Write("ArrayValue: ");
for (int j = 0; j < myArray.Length; j++)
{
Console.Write(myArray[j].word + " ");
}
Console.WriteLine();
}
}
public class wordPoco {
public string word;
}
}
產生的輸出:
Values Before Recursion
ArrayValue: This is a test
ArrayValue: This is a
ArrayValue: This is
ArrayValue: This
Values After Recursion
ArrayValue:
ArrayValue:
ArrayValue:
ArrayValue:
不應在以下JS產生相同結果?
$(document).ready(function() {
var debugBox = $("#debug");
var myArray = [{ word: "This" }, { word: "is" }, { word: "a" }, { word: "test"}];
debugBox.append("<b>Values Before Recursion</b><br/>");
MyRecursiveFunction(myArray);
function MyRecursiveFunction(myArray) {
if (myArray.length <= 0) { debugBox.append("<b>Values After Recursion</b><br/>"); return false; }
var newArray = $.extend(true, [], myArray);
debugBox.append("ArrayValue: ");
for (var j = 0; j < newArray.length; j++)
debugBox.append(newArray[j].word + " " );
debugBox.append("<br/>");
newArray.pop();
arguments.callee(newArray);
myArray = $.extend(true, [], newArray);
debugBox.append("ArrayValue: ");
for (var j = 0; j < myArray.length; j++)
debugBox.append(myArray[j].word + " ");
debugBox.append("<br/>");
}
});
我得到的結果卻是:
Values Before Recursion
Value: This is a test
Value: This is a
Value: This is
Value: This
Values After Recursion
Value:
Value: This
Value: This is
Value: This is a
非常感謝您的時間, 凱文
感謝您的回答, 不幸的是,這不會工作,因爲我從C#移植的算法,通過引用傳遞多個數組。 – Kevin 2009-12-08 19:23:14
我想我可以去捆綁他們陣列在一起,並返回大對象,但理想情況下,我不想這樣... – Kevin 2009-12-08 19:24:32
@Kevin:這聽起來不像是非常漂亮的代碼。參考參數應該比較少見......聽起來你應該把它們封裝在一起。 – 2009-12-08 19:50:33