2012-02-04 5 views
-1

私は2つの別々の関数をjavascriptで持っています。win1 = window.openとwin1.close()は異なる関数で動作しません

win1.close(); 

これらのアクションは、1つの関数にそれが働いてではなく、上記のように別々の機能にされている場合:

機能1は、2つのウィンドウを閉じ

win1 = window.open (....); 

機能を持つウィンドウを開きます。それはどういうわけか、オブジェクトwin1をある関数から別の関数に失います。

どのようなヘルプも大歓迎です!

+0

「win1」は両方の機能でアクセス可能なスコープになければなりません。 [スコープの詳細について](https://developer.mozilla.org/ja/JavaScript/Reference/Functions_and_function_scope) –

+1

テストケースを見ずに推測することもできます。霊能者ではない。 –

答えて

0

また、グローバルwin1を定義することができます。

window.win1 = window.open(...); 
+0

グローバル変数は避けてください。 –

+1

@ imeVidas:任意の一般化が必要です。 –

+2

@LightnessRacesinOrbitブラウザにはすでにグローバル名前空間に何百もの名前が含まれているため(グローバル変数は避けてください)(たとえば、Chromeでは約600)。その名前空間に自分の名前を配置すると、名前の衝突の危険性があり、予期せぬ結果(プログラムの途切れなど)が発生します。ご覧のとおり、私のアドバイスは恣意的ではありません。また、一般化ではありません。 JavaScriptでカスタム名前空間を作成するのは簡単な作業です。グローバル名前空間ではなく、独自の名前空間に変数が存在することをお勧めします。これは事実であり、一般化ではありません。 –

3

両方の関数の外に変数win1を宣言して、両方の関数の変数スコープに入るようにする必要があります。

var win1; // This variable is available in the variable scope of any 
      // ...functions nested in the current scope. 

function f1() { // This function has access to its outer variable scope 
    win1 = window.open(); // ...so it can access the "win1" variable. 

    var foo = 'bar'; // This variable is not available in the outer scope 
}     // ...because it was declared inside this function. 

function f2() { // This function has access to its outer variable scope 
    win1.close(); // ...so it can access the "win1" variable. 

    var bar = 'baz'; // This variable is not available in the outer scope 
        // ...because it was declared inside this function. 

    alert(foo); // Gives a ReferenceError, because "foo" is neither in the 
       // ...current, nor the outer variable scope. 
} 

f1(); // Invoke f1, opening the window. 

f2(); // Invoke f2, closing the window. 

alert(foo); // Would give a ReferenceError, because "foo" is in a nested scope. 
+0

私はこれを試しましたが、関数f2の中でwin1をエコーし​​たとき、それは次のようになります:undefined – BastiaanWW

+0

@BastiaanWesteinde:変数を初期化する前に変数を使用しようとしています。実際のコードを提供するには、質問を編集する必要があります。 –

0

また、グローバル変数を宣言することができます。スクリプト内のどこでも使用できます。

win1を変数として両方の関数に渡すか、2つの関数の外に持つ必要があります。

function somethingHappened() { 
     var url = "http://...."; 
     var win = window.open(url); 

     one(win,url); 
     two(win); 

    } 
function one(win,url) { 
     win.open(url); 


     } 
     function two(win) { 
     win.close(); 

     } 
+0

これはあまり意味がありません。どちらの例もグローバル変数を使用しています。コード例を明確にすることはできますか? –

+0

URLは関数の入力に依存するため、関数1(win)に配置する必要があります。 – BastiaanWW

+0

私は必要な変更を加えました。ユーザーはいくつかのイベントに基づいて新しいウィンドウを開きたいと思っています。あなたが望むのであれば、あなたもURLを渡すことができます。 function one(win、url){ win.open(url); } この関数を呼び出すと、1つ(win、url)を渡す必要があります。 – Yohann

関連する問題