在Javascript中调用函数Object

时间:2009-12-17 08:07:18

标签: javascript

我在javascript中有一个小问题。 这是一个声明:

    function answerToLifeUniverseAndEverything()
    {
       return 42;
    }

    var myLife = answerToLifeUniverseAndEverything();

如果我console.log(myLife) 它将打印42,因为我只是调用相同的函数实例,结果是42作为答案。 (javascripts的基本规则,只传递对象的引用,而不是对象)

另一方面,如果我这样做

var myLife = new answerToLifeUniverseAndEverything();

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

请你澄清我在这里缺少的基本原理吗?

干杯

5 个答案:

答案 0 :(得分: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,否则无论您是否愿意,都会返回 这个新实例。

答案 1 :(得分:3)

当你执行var myLife = answerToLifeUniverseAndEverything();时,myLife只是保持函数调用的返回值 - 在这种情况下,42 myLife在这种情况下对你的函数一无所知,因为函数已被调用,返回,然后它将结果值(42)分配给新变量myLife

执行var myLife = new answerToLifeUniverseAndEverything();时会发生完全不同的事情 - 而是创建一个新对象,将该函数作为this传递给函数,然后(假设函数本身不返回对象) ,存储在新创建的变量中。由于函数返回的是数字而不是对象,因此会存储新生成的对象。

答案 2 :(得分:1)

尝试:

function answerToLifeUniverseAndEverything() {
  return 42;
}

var myLife = answerToLifeUniverseAndEverything;

alert(myLife());

当你这样做时:

var myLife = answerToLifeUniverseAndEverything();

您将功能结果分配给myLife,即42。

答案 3 :(得分:1)

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

例如

o = new f();

等同于(大约)

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

答案 4 :(得分:1)

  

如果我console.log(myLife)它将打印42,因为我只是调用相同的函数实例,结果是42作为答案。 (javascripts的基本规则,只传递对象的引用,而不是对象)

不完全。这是因为您要将answerToLifeUniverseAndEverything()的返回值分配给myLife。如果要复制该函数,请删除括号:

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