在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
子程序在不同的语言里有多种叫法,如过程、函数、方法。
一、子程序定义及调用Perl定义使用关键字sub,调用子程序使用&。JS使用function定义,调用使用小括号()。 sub sayHi { print 'Hi, everybody!'; } &sayHi JS function sayHi() { alert('Hi, everybody!') } sayHi()
二、返回值两者不显示使用return时都具有默认返回值,Perl是undef,JS是undefined。除此之外,Perl在返回确切的数据时可以省略return。其它情形和JS一样,比如在分支中提前返回。 $a = 3; $b = 5; sub sum { $a + $b; # 这里不需要写return } print ∑ # 8 JS var a = 3 var b = 5 function sum() { return a + b } alert(sum()) // 8
三、参数上面示例的数字相加没有实际意义,每次传不同的参数才有用。 Perl中定义参数与JS很不同,它没有小括号,它大括号内部的$_与JS的arguments很象。如下 sub sum { $_[0] + $_[1]; } print &sum(2, 4); JS function sum(a, b) { return a+b } alert(sum(2, 4))
如果不想使用索引方式,Perl还在子程序内部提供了一个“@_”,它是一个列表,存储了调用时的实际参数。 sub sum { print @_; } &sum('hello,', 'world.');
四、Perl和JS的子程序都有副作用,它们可以改变全局变量五、私有、局部变量Perl的子程序内使用my定义的是私有变量,JS则可以使用var定义。 $num = 1; sub fun { my $num = 3; } print $num; # 1 print &fun; # 3 JS var num = 1 function fun() { var num = 3 return num } alert(num) // 1 alert(fun()) // 3
Perl中的关键字my除了在子程序内使用,还可以在语句块(if, while, foreach)中使用,具有块级作用域。JS的“var声明”则不具有。 if (my $a='hello', defined($b)) { print $b; } else { print $a; } print $a; # 执行时报错,$a只能在if语句块中使用 这里if语句中定义了局部变量$a,$b未定义,使用defined函数判断,会进入else中。最终打印“hello”。在if外再打印$a会报错,提示未定义。如果需要定义多个局部变量,Perl中需要使用小括号括起来,JS只需要用逗号分割。 sub sum { my($a, $b) = (1, 2); } 注意,如下声明的只有$a是局部的 my $a, $b;
在JS中不具有块级作用域,因此语句中使用var定义的变量会溢出到外层闭包。如下 for(var i=0; i<10; i++) { alert(i) } alert(i) 打印0-9,有人可能期望i只能在for语句块内(大括号)使用,实际上JS中i在for外面也可以被引用,如果这一段不是写在function内,这个i则是全局变量。这也被认为是JS设计不当之处。 ES6中增加了一个let关键字可用来实现块级作用域,即可在function内可用,也可在for等语句中使用。 <script type="application/javascript;version=1.7"> var i = 1 function sum(a) { let i = 2 return i * a } for (let i = 0; i < 10; i++) { console.log(i) } sum(10) alert(i) </script>
分别在全局,函数sum内,for语句块内声明了同名的变量i,可以看到它们互不影响。最后alert显示的仍然是全局的i。需注意以上代码需在Firefox浏览器中运行。目前Firefox,Chrome支持let。
|
请发表评论