7

いくつかの外部 .js ファイルを読み込もうとしましたが、解決できない名前空間の競合がいくつかあります。

thisウィンドウ オブジェクトを指していた " " をカスタム名前空間に置き換えて、何らかの方法でファイルの一部を独自のコンテキストにロードするというアイデアがありました。

例:

first.js:

name = "first";

second.js:

name = "second";

この種のトリックは非常に便利なように思えます。それはまったく可能ですか?

EDIT
は、" " を置き換えてthisも問題が解決しないようです。これは、javascript での識別子解決のデフォルトのコンテキストではないためです。これは私のテストコードです:

var first = {};
var second = {};

(function(){name = "first";}).call(first);
(function(){name = "second";}).call(second);


document.write('name= '+name+' <br/>\n'); //prints "second"
document.write('first.name= '+first.name+' <br/>\n'); //prints "undefined"
document.write('second.name= '+second.name+' <br/>\n'); //prints "undefined

何か案は?

解決方法
不可能です。私は今朝よりも賢くなり、あきらめました。同様の問題を抱えていて、問題を解決したい人には、これらの啓発的な読み物をお勧めします: http://jibbering.com/faq/notes/closures/
http://softwareas.com/cross-domain-communication- with-iframes

4

6 に答える 6

3

これを行う理由は明確ではありません。正確には何のために使用していますthisか?

second.js の内容を匿名関数でラップすると、そのファイル内の変数がグローバル変数と競合するのを防ぐことができます。thisグローバルオブジェクトではない特定のオブジェクトにセットする必要がある場合は、次のようにすることができます

var differentThis = {};
(function() {
    // Contents of second.js go here
}).call(differentThis);

アップデート

やりたいことができない。JavaScript で変数を宣言するときにプロパティが追加されるオブジェクトであるVariable オブジェクトにアクセスしたいようです。グローバル コードでは、Variable オブジェクトはグローバル オブジェクトであるため、アクセスできます。関数内では、これは直接アクセスする方法がない実行コンテキストのプロパティです。

于 2010-11-08T10:50:59.283 に答える
3

外部 JavaScript ファイルを変更せずにそれを行うために私が考えた 1 つのアイデアは、AJAXy の方法で JavaScript ファイルの内容を取得し (方法はあなた次第)、次のnew Function(code)方法を使用してすべてを関数に入れることです。次に、次のように初期化しnewます。

surrogateWindow = new new Function(jsCode)();

次にsurrogateWindowthisそのコードの です。その考えはうまくいくはずだと思います。

于 2010-11-08T11:46:14.447 に答える
2

これは古い質問ですが、この回答はまだ一部の人に関連している可能性があります。

js ファイルが読み込まれると、ウィンドウのコンテキストが自動的に取得されます。それを変更することはできません。ただし、ロードしているライブラリ間の競合を回避しようとしていて、それらのライブラリを制御できず、組み込みの「非競合」メカニズムがない場合は、優れたトリックがあります。 - それらをソースのない iframe にロードできます。これにより、コンテキストが iframe のウィンドウになり、クロスドメインの問題がないため、iframe にアクセスできます。

このライブラリは、この手法の使用例として見ることができます。

于 2014-06-30T12:14:57.547 に答える
1

あなたが書いたコードについては、JavaScript でクラスが動作する方法のいくつかを誤解していると思います。Java では を削除できthis.ますが、JavaScript では削除できません。あなたはいつもそこにいる必要がthis.あります。したがって、コードは次のようになります。

var first = {};
var second = {};

(function(){this.name = "first";}).call(first);
(function(){this.name = "second";}).call(second);


document.write('name= '+name+' <br/>\n'); //prints "undefined"
document.write('first.name= '+first.name+' <br/>\n'); //prints "first"
document.write('second.name= '+second.name+' <br/>\n'); //prints "second"

より普通のクラスの方法でそれを行うのも良いでしょう。あなたのコードをすべて見ることができないため、あなたの状況が正確にはわかりません。そのため、すでにこの方法で実行している可能性があります。

function Something(name) {
    this.name = name;
}

var first = new Something("first");
var second = new Something("second");

document.write('name= '+name+' <br/>\n'); //prints "undefined"
document.write('first.name= '+first.name+' <br/>\n'); //prints "first"
document.write('second.name= '+second.name+' <br/>\n'); //prints "second"
于 2010-11-08T11:52:18.050 に答える
1

ファイルを にロードできます。ファイルiframeは ではなく.js、次のような HTML ファイルです。

<html>
<body>
  <script>
    var $ = parent.$, // you can share objects with the parent, eg: jQuery
      localObject = { // your local object definition
        name: 'first',
        showName: function(){
          $('div.name').html( this.name );
        }
      };
    //assign the local object to the custom namespace
    parent.customNamespace.object1 = localObject; 
  </script>
</body>
</html>

秘訣はparent.、親ページで使用可能な JavaScript オブジェクトを取得するために使用することです。

于 2010-11-08T09:00:04.470 に答える
-1

jsファイルの内容を次のようにラップすることができます。

var externalInterfaceForYourObject = (function(){
  //code that defines your object

  //this should refer to the current anonymous function, and not the window object
  return this;
})();
于 2010-11-08T08:28:21.667 に答える