JavaScript函数

作者: 张路1806 | 来源:发表于2018-11-06 22:23 被阅读2次

    今天谈谈函数的基本概念,其实数学中的函数和编程中的函数相当类似,但个人认为在编程中的函数更为复杂。

    定义

    JavaScript中的函数是一种原型链中有函数原型(Function-prototype)的一种对象。

    声明函数的方式

    1. 具名函数:function x(arguments){函数体}
    • x为函数名,函数名称可以任意取
    • arguments是参数
    • 函数体中必定会有return,假如没有浏览器自动加上
    1. 匿名函数:var x = function(arguments){函数体}
    • 匿名函数必须有变量容器,因为本身并没有函数名称,如果不使用变量包裹,则无法引用,也会被浏览器当做垃圾回收。
    • arguments是参数
    • 函数体中必定会有return,假如没有浏览器自动加上
    1. var x = function y(arguments){函数体}
    • 此时函数的名称y只能在函数内部引用
    • arguments是参数
    • 函数体中必定会有return,假如没有浏览器自动加上
    1. window.Function(全局对象声明):new Function('x','y','return x+y')
    • new是可以省略的
    • 参数为x,y,并且还可以增加
    1. 箭头函数:f = (arguments)=> {return 表达式}

    函数中的return

    函数必须有返回值,而返回值是用return表示起始,返回的值是由return的下一句代码确定,而之后的代码则不再运行。假如不写,系统默认返回值是undefined。

    如何调用函数

    生成函数之后可以有两种写法调用函数

    • 函数名/变量()
    • 函数名/变量.call(undefined,arguments)

    立即调用函数(IIFE)

    有时候必须在声明函数的时候就调用函数,那么写法如下:

    (function(){ /* code */ }());
    // 或者
    (function(){ /* code */ })();
    

    使用立即调用函数的时候,最后的分号最好加上。

    函数的name属性

    具名函数name就是其函数名
    匿名函数的name就是其变量名称
    第三种声明方式下的函数name是函数名
    全局对象情况下,函数name是‘anonymous’

    函数的length属性

    函数的length属性的值只和声明时有关,只等于声明时函数参数个数。

    函数的基本用法就这些,现在来谈谈函数更深入的使用

    函数的toString属性

    .toString是函数原型(Function.prototype)上的一个key,其属性会覆盖对象原型(Object.prototype)上的tostring属性,而函数原型中,这个属性的value是函数体的源码,用字符串形式储存。

    调用函数和toString的关系

    调用时会执行这段源码,用的是eval()的命令执行之。

    function和var的相似之处

    相同:

    1. function和var都是关键字
    2. function和var的声明都会提升到代码的最前面

    不同之处:

    1. function只能声明函数,var只可以声明变量

    函数的作用域

    函数的作用域只和初始声明时函数作用域相关,与调用函数时函数所处的位置无关

    var a = 1;
    var x = function () {
      console.log(a);
    };
    
    function f() {
      var a = 2;
      x();
    }
    
    f() // 1
    

    函数内部变量也是局部提升的

    闭包:如果一个函数使用了他作用域之外的变量,那么(这个函数和这个变量)就叫做闭包。

    var n = 999;
    
    function f1() {
      console.log(n);
    }
    f1() // 999
    

    相关文章

      网友评论

        本文标题:JavaScript函数

        本文链接:https://www.haomeiwen.com/subject/oeosxqtx.html