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();

输出:函数(​​){返回'嗨'}

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

请解释一下这个结果。谢谢)

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 似乎也没有任何属性,因此它与使用 .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

该函数在第二个示例中返回,因为您返回了一个匿名函数,因此,您可以在 if 前面T1()放置一对括号来执行它:()

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

这不是错误,它是 JS 的一个强大功能。只记得“蜘蛛侠”框架:

强大的力量伴随着巨大的责任。

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

这对我来说似乎是一个错误,但可能是设计使然,因为可以使用返回的函数和对象,并且很容易执行带有参数的工作区。

于 2012-04-04T23:34:13.483 回答