调用Javascript函数的困惑

时间:2015-01-01 06:37:06

标签: javascript

有人可以解释为什么“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"

9 个答案:

答案 0 :(得分:1)

javascript 中,函数被视为DATA。因此,您可以将函数用作变量。

在以下行中,

myPet = pet("Vivie");

你实际做的是调用 pet 函数,包装返回的函数并将其放在 myPet 中。

但是当你编码时,

myPet();

您正在调用myPet()函数[从 pet 返回的函数]。这就是你将宠物分配到它之后得到的确切的myPet。

这就是您编码 myPet(); 时调用该函数的原因。

现在这是一个有趣的事情,

编码时,

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

myPet = pet("Vivie");

它有效!!!!为什么它的工作呢?

当您调用 pet 函数时,它会调用您的名称并返回控制台。它没有返回任何功能。

但是在你的myPet代码中你得到了一个函数。

让我们理解我们理解从 pet 中看到返回对象的类型,

在您的情况下:

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

var myPet = pet("Vivie");
console.log(typeof myPet); // consoles : function.

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

另一个案例:

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

var myPet = pet("Vivie");  // consoles : Vivie
console.log(typeof myPet); // consoles : undefined

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

最后,如果你想立即调用返回的函数,那么你应该采用这种自调用函数。

myPet = pet("Vivie")();

故事的道德:

myPet = pet("Vivie");

此处 myPet 指的是 pet 。和

myPet();

此处 myPet 调用 pet

参考文献: typeof

答案 1 :(得分:1)

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

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

"薇薇"传递给宠物持有的函数,但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());  

在最后一个语句中,myPet()执行导致" Vivie"要打印到控制台但它返回 nothing 。因此,typeof返回" undefined"并且结果也被打印到控制台。请参阅http://jsfiddle.net/yu75k5tz/

回到传递函数的主题,再考虑前面的代码片段。通过使用函数调用链,可以使用另一种更经济的方法来实现相同的结果,如下所示:

pet("Vivie")();

第一组括号调用pet返回一个函数,尽管是匿名的。第二对括号使得返回的函数执行。此代码消除了必须将getName分配给变量,这反过来将两个语句减少到这个单行。

最后,函数定义的尾部分号可能看起来很奇怪,但它们在语法上是正确的。每个匿名函数都被赋值给一个变量,因此每个分号实际上都会终止一个赋值语句。

现场演示:http://jsfiddle.net/kLghedp3/8/

答案 2 :(得分:0)

pet()返回该函数并将其分配给myPet。如果您想调用pet()返回的函数,您也可以执行:pet('Vivie')();

答案 3 :(得分:0)

pet()返回该函数并将其分配给变量myPet。所以Mypet()实际上调用了该函数。如果你想调用pet()返回的函数,你也可以这样做:pet("some name")();

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

如果您注释掉myPet = pet("Tushar");,代码将无法运行,因为mypet()尚未分配任何内容。试试吧。

var pet = function(name) {                
  alert(name);                   
},

myPet = pet("Tushar"); 
myPet(); 

答案 4 :(得分:0)

如果您将逐一在控制台中执行代码,您可能会得到答案。

myPet = pet("Vivie");

以上一行是为myPet分配一个函数,如下图

function () {    
    return console.log(name); 
  }

这里名字的价值来自宠物功能的关闭。

当您致电myPet时,它会使用name as Vivie调用该功能。

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

如果您希望pet函数打印retsult,请将其定义为bellow

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

答案 5 :(得分:0)

通过这一行myPet = pet("Vivie"); 您正在为var myPet分配一个函数和一个参数。所以myPet将成为另一个功能

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

因此你必须调用myPet();作为获得回报的功能。

答案 6 :(得分:0)

这是js函数和变量函数之间的区别,以下是对这些

的非常好的解释

JS Functions Vs Variable Functions

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

    var pet = function(name) {                

    return console.log(name);               

};

pet("test1"); 

答案 7 :(得分:0)

当您调用pet时,您所做的是返回一个函数,并在函数范围的变量name上设置字符串“Vivie”。因此,您的myPet变量接收getName值,该函数打印函数范围名称变量的值。 当您调用myPet时,您已经调用pet返回的函数,getName打印名称变量,其预设值为“Vivie”。

希望有助于清除它。 :)

答案 8 :(得分:0)

为什么您认为myPet = pet("Vivie");没有调用pet函数?显然会调用pet并返回一个分配给myPet的新函数。

现在回到你的代码。

myPet = pet("Vivie"); // ????????

嗯,它不会打印任何东西。它只返回另一个函数。这称为 currying 。您可以详细了解cur here

myPet(); // Returns "Vivie"

返回“Vivie”的原因是因为pet形成了 闭包 ,并且返回的getName函数在其范围内。因此getName可以查看并捕获pet的参数值(在本例中为“Vivie”)并保留它。 myPet()的作用实际上是调用getName的定义。您可以详细了解闭包here