调用Javascript函数的混乱

调用Javascript函数的混乱,javascript,Javascript,有人能解释一下为什么“myPet=pet(Vivie);”实际上不调用pet函数,而myPet()调用吗?它不同于我学习的编程语言,比如Java。谢谢 var pet = function(name) { var getName = function() { return console.log(name); } return getName; }, myPet =

有人能解释一下为什么“myPet=pet(Vivie);”实际上不调用pet函数,而myPet()调用吗?它不同于我学习的编程语言,比如Java。谢谢

var pet = function(name) {                
  var getName = function() {    
    return console.log(name);               
  } 
  return getName;                   
},

myPet = pet("Vivie"); // ????????
myPet(); // Returns "Vivie"
pet()
返回函数并将其分配给
myPet
。如果要调用
pet()
返回的函数,也可以执行:
pet('Vivie')()

pet()返回函数并将其分配给变量
myPet
。因此
Mypet()
实际上调用了该函数。如果要调用pet()返回的函数,还可以执行以下操作:
pet(“某个名称”)()

为了更好地理解,您可以尝试编辑以下示例:

如果您注释掉myPet=pet(“Tushar”)该代码不会运行,因为mypet()未被分配任何内容。试试看

var pet=函数(名称){
警报(名称);
},
myPet=宠物(“Tushar”);

myPet()如果您将在控制台中逐个执行代码,您可能会得到答案

myPet = pet("Vivie");
上面这一行为myPet分配了一个函数,该函数类似于下面的主体

function () {    
    return console.log(name); 
  }
var pet = function(name) {                
  var getName = function() {    
    return console.log(name);               
  } 
  return getName();                   
}
在这里,name的值来自pet函数的闭包

当您调用
myPet
时,它调用的是名为Vivie的
函数

因此,如果您担心函数
pet
没有调用该方法,那是因为在
pet
函数中没有调用该函数。它只是返回函数定义本身

如果希望
pet
函数打印retsult,请像下面那样定义它

function () {    
    return console.log(name); 
  }
var pet = function(name) {                
  var getName = function() {    
    return console.log(name);               
  } 
  return getName();                   
}

通过这一行
myPet=pet(“Vivie”)
您正在为var myPet分配一个函数和一个参数。因此,myPet将成为另一个功能

var getName = function() {    
 console.log(name);               
  } 

因此,您必须调用myPet();作为获取返回的函数

这是js函数和变量函数之间的区别,下面是对这些函数的非常好的解释

您可以通过修改代码直接调用此函数,如下所示:

    var pet = function(name) {                

    return console.log(name);               

};

pet("test1"); 

调用
pet
时所做的是返回一个函数,并在函数作用域变量
name
上设置字符串“Vivie”。因此,您的
myPet
变量接收
getName
值,这是一个打印函数作用域名称变量值的函数。 在调用
myPet
时,您已经在调用
pet
返回的函数,即
getName
打印带有预设值“Vivie”的name变量

希望这有助于澄清

javascript中的函数被视为数据。因此,您可以使用函数作为变量

在下面的行中

myPet = pet("Vivie");
实际上,您所做的是调用pet函数,包装返回的函数并将其放入myPet中

但当你编写代码时

myPet();
var pet = function(name) {                
  return console.log(name);                 
},

myPet = pet("Vivie");
您正在调用myPet()函数[从pet返回的函数]。这正是你把宠物分配进去后得到的我的宠物

这就是编写myPet()代码的原因它正在调用函数

现在有一件有趣的事

当您编写此代码时

myPet();
var pet = function(name) {                
  return console.log(name);                 
},

myPet = pet("Vivie");
有效!!!!那么它为什么会起作用呢?

在这里,当您调用pet函数时,它会控制台您的名字并返回控制台。它没有返回任何函数

但是在myPet的代码中,您得到了一个函数

让我们测试一下我们所了解的pet返回对象的类型

在您的情况下:

您正在调用pet,但在返回的函数中没有执行任何操作。相反,您是说您可以使用myPet执行这个返回的函数

另一种情况:

首先,您执行pet并返回控制台,这就是为什么当您请求typeof myPet时,您没有得到任何定义的类型

最后,如果您想立即调用返回的函数,那么您应该以这种方式使用自调用函数

myPet = pet("Vivie")();
故事的寓意:

这里我的宠物指的是宠物。及

这里myPet调用pet


参考资料:

你为什么认为
myPet=pet(“Vivie”)
不调用
pet
函数
pet
显然被调用并返回一个新函数,该函数被分配给
myPet

现在回到你的代码

myPet = pet("Vivie"); // ????????
嗯,它不会打印任何东西。它只是返回另一个函数。这被称为“咖喱”。你可以学习更多关于咖喱的知识


它返回“Vivie”的原因是pet形成了一个闭包,并且返回的
getName
函数在它的作用域内。因此,
getName
可以查看并捕获
pet
的参数(在本例中为“Vivie”)的值并保留它。
myPet()
实际上是调用
getName
的定义。您可以了解更多关于闭包的信息

如果您来自一种不支持一流函数的语言,那么当您遇到一种支持一流函数的语言时,可能会感到困惑。第一类函数是可以传递给函数或从函数返回的函数,就像它是字符串或数字等普通数据一样。下面的代码应该会有所启发:

var pet = function(name) {   // assign anonymous func to pet               
  var getName = function() { // assign nested anonymous func to getName
    console.log(name);       // prints to console; no return value               
  };
  return getName;            // return getName value: func definition   
};

myPet = pet("Vivie");        // assign getName value to myPet 
myPet();                     // appending () invokes defined func
“Vivie”被传递给pet持有的函数,但是
console.log()
打印它!这是通过一个称为闭包的特性实现的。由于
name
存在于嵌套函数的直接外部环境中,因此即使在外部函数(包含在pet中)执行之后,变量也会绑定到它并继续存在

关于
console.log()
,请注意,将其作为return语句的一部分写入是不正确的,因为logging方法从不返回值;它只是打印到控制台。因此,使用以下代码:

var pet = function(name) {                
  var getName = function() {    
    return console.log(name);               
  } 
  return getName;                   
},

myPet = pet("Vivie"); 
console.log(typeof myPet());  
在最后一句话中,我的宠物(
var pet = function(name) {                
  var getName = function() {    
    return console.log(name);               
  } 
  return getName;                   
},

myPet = pet("Vivie"); 
console.log(typeof myPet());