2017-10-14 5 views
0

ひどいjavascriptコードの可能性について私に許してください。私は左に十分なスペースを持っている最初のデスクトップを見つけレイヤクラスのメソッドを作成しようとしているJavascriptでオブジェクトのプロパティを2回質問できません

function Tile (window_id, size) 
{ 
    this.window_id = window_id; 
    this.size = size; 
}; 

function Desktop() 
{ 
    this.tiles = []; 
    this.ntiles = function() {return this.tiles.length;}; 
    this.size = function() 
    { 
    var sum = 0; 
    for (i = 0; i < this.ntiles(); i++) {sum += this.tiles[i].size;}; 
    return sum; 
    }; 

    this.addTile = function (tile) 
    { 
    if (this.size() === 1) {return -1;}; 
    this.tiles.push(tile); 
    return 0; 
    }; 
}; 

function Layer() 
{ 
    this.desktops = []; 
    this.ndesktops = function() {return this.desktops.length;}; 

    this.addDesktop = function (desktop) 
    { 
    this.desktops.push(desktop); 
    return 0; 
    }; 

    this.availableDesktopSize = function (size) 
    { 
    for (i = 0; i < this.ndesktops(); i++) 
    { 
     print(this.desktops[i].size()); 
     print('hi'); 
     print(this.desktops[i].size()); 
     print('hihi'); 
     var space = 1.0 - this.desktops[i].size(); 
     print('hihihi'); 
     print(space); 
     print(size); 
     if (space >= size) {return i;}; 
    }; 
    return -1; 
    }; 
}; 

var layer = new Layer(); 

var desktop1 = new Desktop(); 
var desktop2 = new Desktop(); 

var tile = new Tile(100, 0.5); 

desktop1.addTile(tile); 
desktop1.addTile(tile); 
desktop2.addTile(tile); 

layer.addDesktop(desktop1); 
layer.addDesktop(desktop2); 

print(layer.availableDesktopSize(0.51)); 
print(layer.availableDesktopSize(0.49)); 

これが私の最初の時間が... JavaScriptで何かをしようとしています。これを達成するために、私のコードを試しているうちに、私は何らかの理由でdesktop.size()プロパティを呼び出すときに初めて正しい値を取得したが、スクリプトをもう一度呼び出すとそれが消滅することがわかりました。これは出力です

1 
hi 
TypeError: Result of expression 'this.desktops[i]' [undefined] is not an object. 

最初の印刷はうまくいきますが、別の時間に同じ機能を実行できないのはなぜですか?

(あなたは非常に有用だろう私のコードを改善するために、他のアドバイスを、持っている場合)

+0

'、使用下の行に2に設定されています'console.log'を開き、通常はキーボードで' F12'を押してコンソールを開きます。 – Mouser

+0

@ Mouser私はブラウザでJavaScriptを使用していませんが、KDE ​​PlasmaのWMコンソール内で、このチュートリアルではKWinを通じて提供されているprint()の使用を提案しています。したがって、print()の使用はありますが、あなたの提案には大変感謝しています:) – LinG

答えて

3

問題は、いくつかのループのグローバル変数を使用していることです。

このようなループ内からメソッドを呼び出すと、そのメソッドに同じ値の別の値を与えるループがあります。i変数。だから、あなたがその電話から戻ってくるとき私ははもはや以前と同じです。

解決方法:ローカル変数として変数を宣言してください。

for (let i = 0; // ...etc 
// ^^^ 
1

使用varがスコープにバインドするために、あなたのイテレータ変数iを宣言する。今、問題の原因となっているグローバルスコープのiを使用しています。

しかし、現代のブラウザletでは、変数がブロックスコープにバインドされるため、より良いでしょう。現在の{}は、その変数の値がそのブロックの外で使用されるのを防ぎます。

function Tile (window_id, size) 
 
{ 
 
    this.window_id = window_id; 
 
    this.size = size; 
 
}; 
 

 
function Desktop() 
 
{ 
 
    this.tiles = []; 
 
    this.ntiles = function() {return this.tiles.length;}; 
 
    this.size = function() 
 
    { 
 
    var sum = 0; 
 
    for (var i = 0; i < this.ntiles(); i++) {sum += this.tiles[i].size;}; //var i binds i to this function scope. 
 
    return sum; 
 
    }; 
 

 
    this.addTile = function (tile) 
 
    { 
 
    if (this.size() === 1) {return -1;}; 
 
    this.tiles.push(tile); 
 
    return 0; 
 
    }; 
 
}; 
 

 
function Layer() 
 
{ 
 
    this.desktops = []; 
 
    this.ndesktops = function() {return this.desktops.length;}; 
 

 
    this.addDesktop = function (desktop) 
 
    { 
 
    this.desktops.push(desktop); 
 
    return 0; 
 
    }; 
 

 
    this.availableDesktopSize = function (size) 
 
    { 
 

 
    for (var i = 0; i < this.ndesktops(); i++) //var i binds i to this function scope. 
 
    { 
 
     console.log(this.desktops[i].size()); 
 
     console.log('hi'); 
 
     console.log(this.desktops[i].size()); 
 
     console.log('hihi'); 
 
     var space = 1.0 - this.desktops[i].size(); 
 
     console.log('hihihi'); 
 
     console.log(space); 
 
     console.log(size); 
 
     if (space >= size) {return i;}; 
 
    }; 
 
    return -1; 
 
    }; 
 
}; 
 

 
var layer = new Layer(); 
 

 
var desktop1 = new Desktop(); 
 
var desktop2 = new Desktop(); 
 

 
var tile = new Tile(100, 0.5); 
 

 
desktop1.addTile(tile); 
 
desktop1.addTile(tile); 
 
desktop2.addTile(tile); 
 

 
layer.addDesktop(desktop1); 
 
layer.addDesktop(desktop2); 
 

 
console.log(layer.availableDesktopSize(0.51)); 
 
console.log(layer.availableDesktopSize(0.49));

0

私は肯定的ではないんだけど、iがあなたのforループに割り当てられている方法のようです。コード

print(this.desktops[i].size()); 
    print('hi'); 
    print(this.desktops[i].size()); 

iこのビットで は0であるが、その後

印刷ダイアログを開きprint`
for (i = 0; i < this.ntiles(); i++) {sum += this.tiles[i].size;}; 

function Tile (window_id, size) 
 
{ 
 
    this.window_id = window_id; 
 
    this.size = size; 
 
}; 
 

 
function Desktop() 
 
{ 
 
    this.tiles = []; 
 
    this.ntiles = function() {return this.tiles.length;}; 
 
    this.size = function() 
 
    { 
 
    var sum = 0; 
 
    for (i = 0; i < this.ntiles(); i++) {sum += this.tiles[i].size;}; 
 
    return sum; 
 
    }; 
 

 
    this.addTile = function (tile) 
 
    { 
 
    if (this.size() === 1) {return -1;}; 
 
    this.tiles.push(tile); 
 
    return 0; 
 
    }; 
 
}; 
 

 
function Layer() 
 
{ 
 
    this.desktops = []; 
 
    this.ndesktops = function() {return this.desktops.length;}; 
 

 
    this.addDesktop = function (desktop) 
 
    { 
 
    this.desktops.push(desktop); 
 
    return 0; 
 
    }; 
 

 
    this.availableDesktopSize = function (size) 
 
    { 
 
    for (i = 0; i < this.ndesktops(); i++) 
 
    { 
 
     console.log(this.desktops[i].size()); 
 
     console.log(i) 
 
     print('hi'); 
 
     print(this.desktops[i].size()); 
 
     print('hihi'); 
 
     var space = 1.0 - this.desktops[i].size(); 
 
     print('hihihi'); 
 
     print(space); 
 
     print(size); 
 
     if (space >= size) {return i;}; 
 
    }; 
 
    return -1; 
 
    }; 
 
}; 
 

 
var layer = new Layer(); 
 

 
var desktop1 = new Desktop(); 
 
var desktop2 = new Desktop(); 
 

 
var tile = new Tile(100, 0.5); 
 

 
desktop1.addTile(tile); 
 
desktop1.addTile(tile); 
 
desktop2.addTile(tile); 
 

 
layer.addDesktop(desktop1); 
 
layer.addDesktop(desktop2); 
 

 
console.log(layer.availableDesktopSize(0.51)); 
 
console.log(layer.availableDesktopSize(0.49));

関連する問題