我在javascript中有一个小问题。 这是一个声明:
function answerToLifeUniverseAndEverything()
{
return 42;
}
var myLife = answerToLifeUniverseAndEverything();
如果我console.log(myLife)
它将打印42,因为我只是调用相同的函数实例,结果是42作为答案。 (javascripts的基本规则,只传递对象的引用,而不是对象)
另一方面,如果我这样做
var myLife = new answerToLifeUniverseAndEverything();
然后我无法调用该函数;相反,myLife只是一个对象?我知道这是同一个函数对象的新副本而不是引用;但为什么我不能调用这个方法呢?
请你澄清我在这里缺少的基本原理吗?
干杯
答案 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());