2009-12-17 130 views
0

我在javascript中有一个小问题。 这里是一个声明:在Javascript中调用函数对象

function answerToLifeUniverseAndEverything() 
    { 
     return 42; 
    } 

    var myLife = answerToLifeUniverseAndEverything(); 

如果我做console.log(myLife) 这将打印42,因为我只是调用的功能,导致42为答案相同的实例。对,如果我做

var myLife = new answerToLifeUniverseAndEverything(); 

那么我就不能调用函数另一方面(在JavaScript的,只有对象的引用传递基本规则,而不是对象)

现在;相反,myLife只是一个对象?我知道这是同一个函数对象的新副本,而不是引用;但为什么我不能调用该方法?

请你澄清我在这里失踪的基本根本吗?

干杯

回答

3

通过前缀调用answerToLifeUniverseAndEverything()new你告诉JavaScript来调用函数为constructor function,类似的(内部),以这样的:

var newInstance = {}; 
var obj = answerToLifeUniverseAndEverything.call(newInstance); // returs 42 
if (typeof obj === 'object') { 
    return obj 
} else { 
    return newInstance; 
} 

JavaScript继续初始化构造函数中的this变量以指向answerToLifeUniverseAndEverything的新实例。除非您自己返回不同的Object,否则无论您是否喜欢,这个新实例都会返回

+0

不一样,你可以返回一个函数。 – IllidanS4 2015-07-12 23:33:18

1

尝试:

function answerToLifeUniverseAndEverything() { 
    return 42; 
} 

var myLife = answerToLifeUniverseAndEverything; 

alert(myLife()); 

当你这样做:

var myLife = answerToLifeUniverseAndEverything(); 

你分配功能结果myLife即42

1

我想我已经描述了的行为3210其他地方。基本上,当你做new f()时,JS引擎创建一个对象并将其作为this传递,如果返回值f()不是对象,则使用该对象。

例如。

o = new f(); 

相当于(约),以

temp = {}; 
temp2 = f.call(temp); 
o = typeof temp2 === "object" ? temp2 : temp; 
1

如果我做console.log(myLife)这将打印42,因为我只是调用的功能,导致42为答案相同的实例。 (只传递对象的引用而不是对象的基本规则)

不完全。这是因为您将answerToLifeUniverseAndEverything()的返回值分配给myLife。如果你想使功能的拷贝,删除括号:

var myLife = answerToLifeUniverseAndEverything; 
console.log(myLife()); 
3

当你这样做var myLife = answerToLifeUniverseAndEverything();,MYLIFE仅仅是保持从函数调用的返回值 - 在这种情况下,42 myLife一无所知在这种情况下你的函数,因为该函数已经调用,返回,然后它将结果值(42)分配给新变量myLife

当你做一个完全不同的事情var myLife = new answerToLifeUniverseAndEverything(); - 而是创建一个新的对象,传递给函数this,然后(假设函数不返回一个对象本身),存储在新创建的变量。由于你的函数返回一个数字,而不是一个对象,所以新生成的对象被存储。

相关问题