Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 当我运行代码时,浏览器不断崩溃_Javascript_While Loop_Three.js_Crash - Fatal编程技术网

Javascript 当我运行代码时,浏览器不断崩溃

Javascript 当我运行代码时,浏览器不断崩溃,javascript,while-loop,three.js,crash,Javascript,While Loop,Three.js,Crash,我有以下代码: var images = ["image1.jpg", "image2.jpg", "image3.jpg", "image4.jpg", "image5.jpg", "image6.jpg", "image7.jpg", "image8.jpg"]; var objects = []; var geometry; while(objects.length < images.length) { var imagesIndex = 0; v

我有以下代码:

var images = ["image1.jpg", "image2.jpg", "image3.jpg", "image4.jpg", "image5.jpg", "image6.jpg", "image7.jpg", "image8.jpg"];
var objects = [];
var geometry;

while(objects.length < images.length) {

        var imagesIndex = 0;
        var object = [

            texture1 = textureLoader.load( "data/"+ images[imagesIndex] ),
            material1 = new THREE.MeshBasicMaterial( { map: texture1 } ),
            objectMesh = new THREE.Mesh( geometry, material1 ),
            location3d = new THREE.Vector3( Math.random()* 500-250, Math.random()* 500-250, Math.random()* 500+120 )

        ];  


        var overlapping = false;
        for (var j = 0; j < objects.length; j++) {
            var projectCubeLoc = objects[j][0][3];
但现在我得到TypeError:无法读取未定义的属性“0”

当我在浏览器中运行此代码时,浏览器会崩溃。。。我没有收到任何错误消息,浏览器将崩溃并自行退出。。。 我认为这与while循环有关,但我不知道是什么错了

非常感谢任何帮助或提示


如果需要更多的代码,或者如果您希望看到JSFIDLE,只需问:)

您没有为对象数组分配任何内容

您的代码从未到达对象。请在for循环中推送调用


您将数组初始化为空,因此当它到达查找
j==0
objects.length==0
时,循环不会运行。

我不确定您是否正在使用Unity3d,但当我尝试执行这样一个C#代码时,它发生在我身上。 实际上,您正在循环中声明一个变量,每次它更新时,它总是将该变量的值设置为零,使其成为网格

  • while(objects.length
    循环开始时,您必须 空数组,它将首先通过,因为此时间长度为
    对象小于图像数组
  • 在前进的过程中,您已经声明了新的变量
    object
    ,该变量 应该被推入或添加到
    对象中
    (我的假设 根据命名)。然后你是(var j=0;j
    var images=[“image1.jpg”,“image2.jpg”,“image3.jpg”,“image4.jpg”,“image5.jpg”,“image6.jpg”,“image7.jpg”,“image8.jpg”];
    var对象=[];
    几何图形=新的三个长方体几何图形(100100100,10,10);
    while(objects.length

    我用一个名为object的对象替换了对象数组。通过这种方式,我可以从数组中获取所需的数据,而不必处理0个未定义的错误。现在效果很好;)感谢@Asad Jamil提供的所有帮助,希望这对将来的任何人都有帮助:)

    当您启动循环时,
    对象
    数组为空。所以你的
    for
    循环永远不会运行。for循环中的代码是唯一可以向对象数组添加任何内容的东西。你已经有了一个无限循环。任何javascript都不应该使浏览器崩溃并突然退出。您的代码中可能有一个bug,但浏览器中也有一个bug,不同浏览器的行为会有所不同(所以您应该说您使用的是哪个浏览器)。您还可以尝试在代码中的不同点插入警报,以了解它在崩溃浏览器之前能走多远。然后你可以试着绕过有问题的那一行(也许还可以向浏览器作者提交一份bug报告)。我正在使用一个名为three.jsI的javascript库。我对js是新手,不知道上面提到的库使用了什么。但是我分享了我的个人经历。谢谢你的解释:)你能给我一个解决方案吗?给我更多的洞察力?一般来说,我对编程很陌生。。。因为我自己也无法真正理解这一点:(@FutureCake你不明白什么?你能描述一下吗?在哪一部分你想让我多放点光?你的意思是什么:你有一个空数组,它一开始会通过,因为对象的时间长度小于图像数组。你确切地说,初始通过是什么意思?哦,我想我明白了!因为对象数组是空的for循环永远不会运行,因为长度=0,这就是为什么没有添加任何内容。然后,你会得到一个不受约束的循环,因为while循环一直在尝试…那么,当对象第一次添加到对象数组中时,我该如何使它运行呢?当然,我明天会创建一个,谢谢你迄今为止的所有帮助!)
                var otherCubesLoc = projectCubeLoc[j];
                var distance = projectCubeLoc.distanceTo( otherCubesLoc );
                console.log(distance);
    
                if (distance < 150) {
                    overlapping = true;
                    break;
                };
            };
    
            if (!overlapping) {
                objects.push(object);
                imagesIndex++;
            };
         };
    
    var images = ["image1.jpg", "image2.jpg", "image3.jpg", "image4.jpg", "image5.jpg", "image6.jpg", "image7.jpg", "image8.jpg"];
    var objects = [];
    
    geometry = new THREE.BoxGeometry( 100, 100, 100,10,10 );
    
    while(objects.length < images.length) {
    
        var imagesIndex = 0;
    
        var object = {};
        object.texture1 = textureLoader.load( "data/"+ images[imagesIndex] );
        object.material1 = new THREE.MeshBasicMaterial( { map: object.texture1 } );
        object.objectMesh = new THREE.Mesh( geometry, object.material1 );
        object.location3d = new THREE.Vector3( Math.random()* 500-250, Math.random()* 500-250, Math.random()* 500+120 );
    
        var overlapping = false;
        for (var j = 0; j < objects.length; j++) {
            var projectCubeLoc = objects[j].location3d;
            var distance = projectCubeLoc.distanceTo( object.location3d );
    
            if (distance < 150) {
                overlapping = true;
                break;
            };
        };
    
        if (!overlapping) {
            objects.push(object);
            imagesIndex++;
            object.objectMesh.position = object.location3d;
            console.log(object.location3d);
            scene.add(object.objectMesh);
        };
    };
    
    
    console.log(objects);