zoukankan      html  css  js  c++  java
  • ECMAScript中的函数

    有 3 种定义函数的方式

    • 函数声明
    • 函数表达式
    • Function 构造函数(很少使用)

    函数声明

    function 关键字后需要指定函数名

    function sum(num1, num2) {
      return num1 + num2;
    } // 不加分号
    
    console.log(sum(2, 3)); // 5
    

    函数表达式

    function 关键字后不用指定函数名;函数末尾需要添加一个分号,就像声明其他变量时一样

    var sum = function (num1, num2) {
      return num1 + num2;
    }; // 加分号
    
    console.log(sum(2, 3)); // 5
    

    Function 构造函数

    Function 构造函数可以接收任意数量的参数,但最后一个参数始终都被看成是函数体,而前面的参数则枚举出了新函数的参数。

    var sum = new Function('num1', 'num2', 'return num1 + num2'); // 不推荐
    
    console.log(sum(2, 3)); // 5
    

    函数声明与函数表达式

      函数声明函数表达式 是有区别的。执行代码时,解析器会率先读取函数声明,并使其在执行任何代码之前可用(可以访问);至于函数表达式,则必须等到解析器执行到它所在的代码行,才会真正被解释执行。

      同时说明:函数声明会被提升;函数声明要早于变量声明被解析器读取

    // 函数声明提升
    console.log(sum(2, 3)); // 5 (函数声明被提升到源代码树顶部)
    
    function sum(sum1, sum2) {
      return sum1 + sum2;
    }
    

    如果把上面的函数声明改为等价的函数表达式,执行将报错:

    console.log(sum(2, 3)); // TypeError: sum is not a function
    
    var sum = function (sum1, sum2) {
      return sum1 + sum2;
    }
    

    关于ECMAScript中的函数

    • 函数实际是对象。每个函数都是 Function 类型的实例,而且都与其他引用类型一样具有属性和方法。
    • 由于函数是对象,因此 函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定。即:函数是对象,函数名是指针
    • 因为函数名本身就是变量,所以函数也可以作为值来使用。也就是说,不仅可以像传递参数一样把函数传递给另一个函数,而且可以将一个函数作为另一个函数的结果返回。
    • 要访问函数的指针而不执行函数的话,必须去掉函数名后面的那对大括号。
    • 没有重载,后面的函数会覆盖前面的同名函数
    • 每个函数都包含两个非继承而来的方法:apply() 和 call()。用途都是在特定的作用域中调用函数,即设置函数体内 this 对象的值。
    function sum(num1, num2) {
      return num1 + num2;
    }
    console.log(sum(2, 3)); // 5
    
    var anotherSum = sum; // 使用 不带圆括号 的函数名是访问函数指针,而非调用函数
    console.log(anotherSum(2, 3)); // 5
    // 以下为关键代码
    sum = null;
    console.log(anotherSum(2, 3)); // 5
    

    可以结合以下例子理解

    var obj1 = new Object();
    var obj2 = obj1;
    
    obj1.name = 'Nicholas';
    console.log(obj2.name); // Nicholas
    
    obj1 = null;
    console.log(obj2.name); // Nicholas
    
  • 相关阅读:
    c 语言 运算符 优先级
    回文字符串个数
    最小操作数
    将一个二叉树转化为双向链表,不开辟新空间
    两个整数集合的交集 ———— 腾讯2014软件开发笔试题目
    python download
    Spring5.2.X源代码编译-问题-Unable to locate Spring NamespaceHandler for XML schema namespace [http://www.springframework.org/schema/context]
    Spring5.2.X源代码编译-问题-找不到CoroutinesUtils
    Spring5.2.X源代码编译
    入行四年的思考
  • 原文地址:https://www.cnblogs.com/uakora/p/12694876.html
Copyright © 2011-2022 走看看