JavaScript返回方法
我是javascript新手。 我不明白为什么在下面的示例中函数返回T1对象(不仅仅是字符串“hi”)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();
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'; }
}