4

私はJavaScriptを初めて使用します。次の例で、関数がT1オブジェクト(文字列'hi'だけでなく)を返す理由がわかりません。

 function T1(){
    return 'hi';
 }
 function T(){
    return new T1();
}
T();

出力:T1

そして、次の例で関数を返します

 function T1(){
    return function(){ return 'hi'; }
 }
 function T(){
    return new T1();
}
T();

出力:function(){return'hi'}

最初の例がオブジェクト(文字列 "hi"ではなく、何が起こると予想されるか)を返し、2番目の例が最初の関数(予期されるオブジェクトではない)から返される関数本体を返すのはなぜですか?

この結果を説明してください。ありがとうございました)

4

4 に答える 4

4

newキーワード。それはオブジェクトになります。

 function T1(){
    return 'hi';
 }
 function T(){
    return T1();
}
T(); // 'hi'

JavaScriptオブジェクトは次のようになります。

 function T1(){
    this.test = function(){
        return 'hi';
    };
 }
 function T(){
    return new T1();
}
var test = T(); // T1 object
test.test(); // 'hi'
于 2012-04-04T23:26:48.270 に答える
4

コンストラクター関数が別のnewオブジェクトを返さない限り、オペレーターはオペレーターによって作成されたオブジェクトを返します。コンストラクター関数のオブジェクト以外の戻り値はすべて無視されます。そのため、返すときにこれはhi表示されません。

仕様のセクション13.2.2("[[Construct]]")。これはセクション11.2.2("演算子")によって参照されます。new

于 2012-04-04T23:27:32.317 に答える
1

あなたのコードでは:

> function T1() {
>      return 'hi';
> }

コンストラクターとして呼び出される関数は常にオブジェクトを返しますが、文字列は返しません。したがって、単に関数として呼び出されると、T1は文字列'hi'を返しますが、コンストラクターとして呼び出されると、新しいT1インスタンスを返します。そのインスタンスにはプロパティが割り当てられておらず、T1.prototypeにもプロパティが割り当てられていないように見えるため、を使用して作成されたオブジェクトとほとんど区別できませんnew Object()

これはとになり、instanceof T1そのコンストラクタープロパティはT1を参照します。

> function T() {
>      return new T1();
> }

慣例により、コンストラクターのみが大文字で始まります(定数はすべて大文字である可能性があります)。

> T(); 

T関数は、新しいT1オブジェクトを返すだけです。このオブジェクトは何にも割り当てられていないため、参照または呼び出すことができないため、ガベージコレクションにすぐに使用できます。特別なメソッドやプロパティはありません。

var t = T(); // returns a new T1 instance
t();  // throws an error since t is a plain object, 
      // not a function and so can't be called.

編集

質問が変更されたので:

function T1() {
     return function(){ return 'hi'; }
} 

この場合、T1がコンストラクターとして呼び出されると、returnステートメントはObjectである関数(すべての関数はオブジェクト)を返すため、それが返されます。

于 2012-04-04T23:52:10.970 に答える
0

2番目の例では、匿名関数を返したため、関数が返されます。そのため、次の場合の前にT1()括弧のペアを配置して実行できます。()

function T1(){ 
    return function(){ return 'hi'; } 
} 
function T(){ 
   return new T1(); 
} 
T()(); // hi
// or
var T2 = T();
T2(); // hi

これはバグではなく、JSの強力な機能です。「スパイダーマン」のフレーズを覚えておいてください。

大きな力には大きな責任が伴います。

編集:
今、私は本当の質問を見る:なぜ最初の例はオブジェクト(文字列 "hi"ではなく、何が起こると予想されるか)を返し、2番目の例は最初の関数から返される関数本体(予想されるオブジェクトではない)を返すのですか? )?

これは私にはバグのように思えますが、返される関数とオブジェクトを使用でき、パラメーターを使用した作業が簡単であるため、おそらく設計によるものです。

于 2012-04-04T23:34:13.483 に答える