2014-01-31 48 views
0

我正在學習一些使用JavaScript和Three.js庫的WebGL概念,但是我試圖找出如何使用OBJLoader來加載.obj文件使用類。繼承人的代碼:JavaScript中的匿名函數的範圍問題

Model.prototype.loadModel = function() { 
    var self = this; 
    loader = new THREE.OBJLoader(); 

    loader.load(this.modelPath, function (object) { 
     object.traverse(function (child) { 
      if (child instanceof THREE.Mesh) { 
       child.material.map = self.modelTexture; 
      } 
     }); 
     self.modelObj = object; 
     console.log(self.modelObj); // Returns [Object object] 
    }); 
     console.log(self.modelObj); // Returns undefined 

    this.modelObj = self.modelObj; 
    this.modelObj.position.x = this.x; 
    this.modelObj.position.y = this.y; 
    this.modelObj.position.z = this.z; 
} 

我不能得到的對象爲this.modelObj使用了匿名函數的,我認爲這是一個範圍的問題。試圖將this.modelObj添加到函數參數中導致「缺少形式參數」並在函數內部使用this.認爲它在函數的範圍內(或加載器)

回答

2

爲了有一個回調完成加載時被調用,添加回調作爲參數傳遞給你的函數:

Model.prototype.loadModel = function (callback) { 
    var self = this; 
    var loader = new THREE.OBJLoader(); 

    loader.load(this.modelPath, function (object) { // inner function will be called on success 
     object.traverse(function (child) { 
      if (child instanceof THREE.Mesh) 
      { 
       child.material.map = self.modelTexture; 
      } 
     }); 

     self.modelObj = object; 
     callback(object); // pass loaded object to callback function 
    }); 
} 

當你做這樣你單獨加載邏輯回調,您將實際使用/使用您已加載的數據。 想象一下,您有多個這樣的案例,您不必一次又一次地寫入該加載邏輯(內部的成功函數)。

XHR(用於AJAX)也接受錯誤函數,並要求您的函數檢查readystate變量。我不知道這是否也適用於這臺裝載機。但是如果可以的話,你也應該執行錯誤情況。

+0

提供的答案我寧願使用'callback(self);'因爲'self.modelObj'中已有'object'的實例。 – antyrat

+0

是的,這個可能是一個好主意,但這取決於你想如何讓內在的膽量暴露在回調之中。一個簡單的規則是*儘可能少*,所以'自我'可能太多了。我真的不知道,但我很欣賞指出這個弱點。 – pid

+0

您將'this'存儲在'that'變量中,但不使用它,'self'指的是'window'對象,因此您將'modelObj'定義爲全局變量。 – Givi

1

這不是範圍範圍的情況。問題是loader.load異步函數調用(如AJAX)。因此,您應該使用回調例如使您的代碼正常工作。

+0

回調應該是loader.load()的第三個參數還是匿名函數的第二個參數? – Mknsri

+0

@Mknsri有很多可能的方法,其中一個是由pid – antyrat