Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaScript中调用函数对象_Javascript - Fatal编程技术网

在JavaScript中调用函数对象

在JavaScript中调用函数对象,javascript,Javascript,我有一个关于JavaScript的小问题 以下是一份声明: function answerToLifeUniverseAndEverything() { return 42; } var myLife = answerToLifeUniverseAndEverything(); 如果我执行console.log(myLife),它将打印42,因为我只是调用了与答案相同的函数实例,结果是42。(JavaScript的基本规则是只传递对象的引用,而不传递对象。) 另一方面,如果我这样做:

我有一个关于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;
}