zoukankan      html  css  js  c++  java
  • 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。 

  • 相关阅读:
    97. Interleaving String
    96. Unique Binary Search Trees
    95. Unique Binary Search Trees II
    94. Binary Tree Inorder Traversal
    odoo many2many字段 指定打开的form视图
    docker sentry 配置文件位置
    postgres 计算时差
    postgres 字符操作补位,字符切割
    postgres判断字符串是否为时间,数字
    odoo fields_view_get
  • 原文地址:https://www.cnblogs.com/snandy/p/2753327.html
Copyright © 2011-2022 走看看