Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript返回方法_Javascript - Fatal编程技术网

JavaScript返回方法

JavaScript返回方法,javascript,Javascript,我是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();

我是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();
输出:函数(){return'hi'}

为什么第一个示例返回一个对象(不是字符串“hi”,即预期发生的情况),而第二个示例返回从第一个函数返回的函数体(不是预期的对象)


请解释这个结果。谢谢)

新的
关键字。这就是一个物体

 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'

new
运算符返回该运算符创建的对象,除非构造函数返回不同的对象。构造函数的任何非对象返回值都会被忽略,这就是为什么当您返回
hi
时,您看不到这一点


第13.2.2节(“[[Construct]]”),第11.2.2节(“新的
运算符”)引用了该节。

在第二个示例中返回该函数,因为您在
T1()
上返回了一个匿名函数,因此,您可以将一对父项
()
放在以下情况下执行该函数:

function T1(){ 
    return function(){ return 'hi'; } 
} 
function T(){ 
   return new T1(); 
} 
T()(); // hi
// or
var T2 = T();
T2(); // hi
这不是一个bug,而是来自JS的强大功能。 只要记住“蜘蛛侠”弗雷斯:

权力强大,责任重大

编辑:
现在我看到了真正的问题:为什么第一个示例返回一个对象(而不是字符串“hi”,预期会发生什么),第二个示例返回从第一个函数返回的函数体(而不是预期的对象)?

这对我来说似乎是一个bug,但可能是出于设计,因为可以使用返回的函数和对象,并且使用参数的解决方法很容易做到。

在您的代码中:

> function T1() {
>      return 'hi';
> }
作为构造函数调用的函数将始终返回对象,而不会返回字符串。因此,当简单地作为函数调用时,T1将返回字符串“hi”,但当作为构造函数调用时,它将返回一个新的T1实例。由于该实例没有指定任何属性,T1.prototype似乎也没有任何属性,因此它几乎无法与使用
new object()
创建的对象区分开来

它将是T1的
实例,其构造函数属性将引用T1

> function T() {
>      return new T1();
> }
按照惯例,只有构造函数以大写字母开头(常量除外,常量可能都是大写)

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语句返回一个函数,该函数是一个对象(所有函数都是对象),因此返回的就是这个函数。

在第二个示例中,我还使用了“new”。但函数返回。为什么?@user1314034在Javascript中函数是对象的一种类型,所以上面的解释仍然适用,即使函数看起来不像是返回对象克里斯·盖斯勒,你的答案是最好的!tnx!好啊但我需要T1的新对象。在第二个例子中,我还使用了“new”。但函数返回。为什么?@user1314034:当您创建一个
新的
对象时,函数不应该返回任何内容。参见第二个示例,我刚刚添加了。@user1314034表达式
new T1()
不返回函数,它返回一个普通对象。Yeap。我可以用T()。但我不明白为什么函数可以返回,而字符串不能返回。我已经用实际问题编辑了我的答案。也许你可以用它让人们不再像我一样回答。问题是:为什么第一个示例返回一个对象(而不是字符串“hi”,即预期会发生什么),而第二个示例返回从第一个函数返回的函数体(而不是预期的对象)?第二段第一句就解释了这一点。代码的任何一位都不会返回函数。如果T1作为函数调用,它将返回一个字符串。如果作为构造函数调用,它将返回一个普通对象。那你为什么不第一次回答呢?好了,讨论够了。问题已经回答。rcdmk—OP更改了问题。
function T1() {
     return function(){ return 'hi'; }
}