在JavaScript中调用函数对象
我有一个关于JavaScript的小问题 以下是一份声明:在JavaScript中调用函数对象,javascript,Javascript,我有一个关于JavaScript的小问题 以下是一份声明: function answerToLifeUniverseAndEverything() { return 42; } var myLife = answerToLifeUniverseAndEverything(); 如果我执行console.log(myLife),它将打印42,因为我只是调用了与答案相同的函数实例,结果是42。(JavaScript的基本规则是只传递对象的引用,而不传递对象。) 另一方面,如果我这样做:
function answerToLifeUniverseAndEverything() {
return 42;
}
var myLife = answerToLifeUniverseAndEverything();
如果我执行console.log(myLife)
,它将打印42
,因为我只是调用了与答案相同的函数实例,结果是42
。(JavaScript的基本规则是只传递对象的引用,而不传递对象。)
另一方面,如果我这样做:
var myLife = new answerToLifeUniverseAndEverything();
那我就不能调用这个函数了;相反,myLife
变成了一个对象?我知道这是同一个函数对象的新副本,而不是引用,但为什么我不能调用该方法呢
你能澄清一下我在这里缺少的基本知识吗?试试:
function answerToLifeUniverseAndEverything() {
return 42;
}
var myLife = answerToLifeUniverseAndEverything;
alert(myLife());
当您这样做时:
var myLife = answerToLifeUniverseAndEverything();
您正在将函数结果分配给
myLife
ie 42。我想我已经在其他地方描述了new
的行为。基本上,当您执行new f()
时,JS引擎会创建一个对象并将其作为this
传递,然后在f()
的返回值不是对象时使用该对象
例如
相当于(大约)于
如果我执行console.log(myLife)
操作,它将打印42,因为我只是调用相同的函数实例,得到42作为答案。(Java脚本的基本规则,只传递对象的引用,而不传递对象)
不完全是。这是因为您正在将answerToLifeUniverseAndEverything()
的返回值赋给myLife
。如果要复制函数,请删除括号:
var myLife = answerToLifeUniverseAndEverything;
console.log(myLife());
通过使用
new
作为对answerToLifeUniverseAndEverything()
的调用的前缀,您告诉JavaScript作为一个函数调用函数,类似于(内部)这样:
JavaScript继续初始化构造函数函数中的
这个
变量,以指向answerToLifeUniverseAndEverything的新实例
。除非您自己返回一个不同的对象
,否则无论您喜欢与否,都会返回这个新实例。当您执行var myLife=answerToLifeUniverseAndEverything()代码>,myLife只是保存函数调用的返回值——在本例中为42<在这种情况下,code>myLife
对函数一无所知,因为函数已被调用、返回,然后它将结果值(42)赋给新变量myLife
当您执行
var myLife=new answerToLifeUniverseAndEverything()时,会发生完全不同的事情代码>-相反,创建一个新对象,作为this
传递给函数,然后(假设函数本身不返回对象)存储在新创建的变量中。由于您的函数返回的是数字,而不是对象,因此新生成的对象将被存储。不同的是,您可以返回函数。
temp = {};
temp2 = f.call(temp);
o = typeof temp2 === "object" ? temp2 : temp;
var myLife = answerToLifeUniverseAndEverything;
console.log(myLife());
var newInstance = {};
var obj = answerToLifeUniverseAndEverything.call(newInstance); // returs 42
if (typeof obj === 'object') {
return obj
} else {
return newInstance;
}