26.JS函数

122 阅读1分钟

函数的五种声明方式.

  1. 具名函数
    function a(x){
        console.log(x);
        return undefined;
    }
    /*console.log()只接受字符串,如果不是字符串会自动调用toString()方法.
    得到"function a(x){console.log(x)}"*/
    
  2. 匿名函数
    var a = function(x)(
        console.log(x)
    )
    
  3. var x = function y(input1,input2){}
    

    和直接声明具名函数的区别是如果执行console.log(y)会提示 y is not defined.如果执行console.log()则会打印出函数的内容.

  4. window.Function
    q = new Function('x','y','return x+y');
    q(1,2);  //结果为3
    
    var n = 1;
    q = new Function('x','y','return x+'+n+'+y'); 
    q(1,2);         //结果是4
    
  5. 箭头函数
    f1 = (x,y)=>{return x+y}
    f1(6,6);   //结果是12
    //只有一句语句时可以省略花括号和return
    f2 = (x,y) =>x+y;
    f2(1,2);   //结果是3
    //只有一个参数时小括号也可省略
    f3 = x => x*x;
    f3(3);     //结果是9
    

函数是一段可以反复调用的代码块.

eg:

function triangleArea(h,w){
    var n = h*w;
    var m = n/2;
    return m;
}
triangleArea.call(undefined,1,2);                  //结果是1

以上就是一个能求三角形面积的函数. 那么什么是this,arguments呢?triangleArea.call(undefined,1,2); 中的

  1. undefined就代表this.
  2. 后面的参数就可以用arguments来表示.
下面举例说明:
f = function(){
    'use strict';
    console.log(this);
    console.log(arguments);
}

执行f.call(1,2,3);得到如下结果.

而arguments是一个伪数组,伪数组就是长得像数组,但是原型链中无Array.prototype就是伪数组.它的__proto__指向Object.prototype.

什么是闭包呢?

var a = 1;
function b(){
    console.log(a);
}

向上面这种一个函数使用了它范围外的变量,那么这个函数与这个变量合称闭包.