Perl与JS的比较(子程序)

子程序在不同的语言里有多种叫法,如过程、函数、方法。

 

一、子程序定义及调用

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。 

 

posted on 2012-11-04 14:16  snandy  阅读(2730)  评论(1编辑  收藏  举报