我正在研究JavaScript函数的工作方式,并且想知道在声明函数时传递或不传递参数背后的原理是什么。
例如在下面的Block 1
中,我声明了该函数,而没有传递任何参数,并且该函数正常运行。我在Block 2
中复制了相同的练习,但在这种情况下,我还传递了参数,并且警报显示“ NaN”。
这是什么原因?
var integer1 = 10;
var integer2 = 20;
function sum () {
sum = (integer1 * integer2);
return sum;
}
alert(sum());
var integer1 = 10;
var integer2 = 20;
function sum (integer1, integer2) {
sum = (integer1 * integer2);
return sum;
}
alert(sum());
关于您的NaN
错误,您试图在不传递任何参数的情况下调用可重用函数(BLOCK#2中的函数),因此它不返回任何明显是Not a Number(NaN)的函数。
第1块功能:
第一个函数不是可重用函数,这意味着每次您需要计算一些新值时,都将必须像下面这样相应地更新变量integer1
和integer2
:
function sum() {
return (integer1 * integer2);
}
var integer1 = 5;
var integer2 = 10;
console.log(sum());
var integer1 = 11;
var integer2 = 31;
console.log(sum());
第2块功能:
然而,第二个函数是一个可重用的函数,可以使用像这样的参数传递给函数的不同参数来一遍又一遍地调用它:
function sum(integer1, integer2) {
return (integer1 * integer2);
}
console.log(sum(5, 25));
console.log(sum(8, 32));
console.log(sum(1, 3));
console.log(sum(5, 9));
虽然在编写函数时,您需要在某些地方传递一些值来执行该函数,否则,您的函数体可以自行执行。尽管任务背后的逻辑是相同的,但它们对于程序员而言却是不同的。让我们考虑上面给出的示例,
我们需要实现的简单添加功能。
var integer1 = 10;
var integer2 = 20;
function sum () {
sum = (integer1 + integer2);
return sum;
}
alert(sum());
要获得结果,您需要像体内一样具有integer1
和interger2
。因此您函数的逻辑取决于其他元素。这不是一个好习惯,因为我们构建了独立于其余代码的函数来处理特定逻辑。这样我们就可以在整个执行过程中调用该函数,并且它始终会执行相同的行为。
var integer1 = 10;
var integer2 = 20;
function sum (integer1, integer2) {
sum = (integer1 + integer2);
return sum;
}
alert(sum(integer1, integer2));
现在,在这种情况下,我们正在调用相同的函数,但是带有参数。在这种情况下,加法器需要至少2个值才能相加。因此,调用此函数的任何时间点都会为我们提供传递参数之和的结果。因此,此函数不依赖于var integer1
和var integer2
,如果将其他一些变量传递给此函数,则可以得到相同的行为。
现在我们在调用函数时要牢记(就像您在“ alert(sum());
”中所做的一样),我们需要检查函数是否需要任何参数,如果是,那么我们必须将其作为参数传递,例如,
// define our adding function
function sum (a, b) { // argument variables may have different variable names
sum = (a + b); // which only live within the function **scope**
return sum;
}
//calling sum
sum(integer1, integer2); // we already declared these two variables integer1 & integer2
// calling sum with direct values
sum(5, 5); // it returns 10
// now we have two new variables
var num1 = 50;
var num2 = 20;
sum(num1, num2); // as we expect it returns 70
NaN
这是一种语言功能,当您使用Javascript时,任何未定义的变量都具有值undefined
,您可以说它是Javascript的属性
NaN表示不是数字,当我们执行加法运算时,函数中的参数变量期望自己为数字类型变量,但是,因此,在调用sum()
函数integer1
和[C0时,我们没有传递任何参数]拥有未定义的属性,因此您得到的是NaN。
您可以看到,我传递了两个整数值integer2
来调用5, 5
,在另一种情况下,我传递了sum
整数类型变量来调用num1, num2
。
*如果仔细查看最后一行,就会看到您调用了alert()。这是一个预定义的函数,我们可以从javascript编程语言中获取。但是要发出警报,我们需要传递一个值,然后只有它可以在警报框中显示该值。
所以您打电话给sum
(您的正确代码)它首先执行sum并从中返回值,然后使用返回值调用alert并将其作为调用自身的参数。之后,我们将获得带有添加结果的警报框。
谢谢,希望您能对功能有所了解。这是一个笼统的概念,不仅限于javascript。
参数很方便,因为您可以将相同的函数与所需的任何值一起使用。在您的BLOCK 2中,您在调用sum函数时忘记了传递参数。
alert(sum(integer1, integer2));
由于调用函数时未传递参数,因此它们是未定义的,尝试将两个未定义的变量相乘会导致NaN。
block2中的函数正在使用期望传递的变量。在这种情况下,您没有传递任何东西,因此integer1和integer2是空引用/未定义。
对于block1,您已经声明了具有整数值的全局变量,然后将它们在函数中使用。
看起来这个问题主要是关于了解参数的确切工作方式。实际上,带有参数的函数调用将在其余函数代码执行之前立即将值分配给局部变量。要使用经过稍微编辑的示例代码:
alert(sum(integer1, integer2))
了解其工作原理的关键是function product(integer1, integer2) {
returnValue = integer1 * integer2;
return returnValue;
}
alert(product(10, 20));
将按顺序将传递的值分配给每个参数,如下所示:
product(10, 20)
仅想象函数在最上方包含以上两行。