• 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。 

  • 相关阅读:
    Abp Hangfire 占用 PostgreSql 连接数的另类解决方案
    Git 仓库中文件大小写重命名实践(Windows 环境)
    C# WinForm 文件夹选择控件 folderBrowserDialog 的应用实例
    使用 C# 修改文件创建时间(图片也可修改)
    ABP 在 EntityFramework 中使用扩展批量更新时的异常
    Visual Studio之“生成事件”实践
    博客专家纪念
    深入浅出-应用服务
    如何管理 .NET Core 工具
    深入浅出-可定制仓储设计
  • 原文地址:https://www.cnblogs.com/snandy/p/2753327.html
Copyright © 2020-2023  润新知