[前端JS学习笔记]JavaScript function

一、函数的声明

1.1 function 命令

function methodName(params) {
       // code    
}

如下声明:

function test_function(params) {
    console.log("function");
}

如上函数, 声明了 test_function函数, 以后使用test_function(params) 都会调用相应的代码, 这就是函数的声明

1.2 函数表达式

 除了1.1的函数直接声明,JS还可以用函数赋值给一个变量,即函数表达式。

我们先来看下它的语法是怎么玩的。

var methodName = function() {
    // code
};

如下玩法

var test_function = function() {
    console.log("function");
};

 如上函数是把一个匿名函数赋值给一个变量,  匿名函数就是没有名字了,顾名思义,所以function命令后不要再加函数名。特别要提醒一点 : 使用函数表达式声明的, 函数的声明在结尾的大括号需要加上 分号  表示语句结束。

而函数声明的结尾的大括号后面可以不加 分号。

1.3 Function构造函数

先看下语法

var methodName = new Function(
    params...
);

玩法

如果有多个参数,最后一个参数会被当做函数体使用

var test_function = new Function('a','b',
    'return (a + b)'
);
console.log(test_function(1,2)); // 3

上面函数等价于

function add (a, b) {
      return a + b;    
} 

剖析下第一种写法的参数语义, 除了最后一个参数add 被当做函数体外,其它参数可以看做是函数体add的参数。

Function接受任意类型的参数, 如果只有一个参数,那该参数即被当做函数体使用

var methodName = new Function(
    'console.log("function")'
);

二、函数的其它知识点

2.1 闭包

在JavaScript中,闭包是一个难点,在很多高级应用中基本会使用闭包实现。要理解闭包,我们先来看下变量的作用域吧。无非就两种,全局、局部作用

下面的内部函数使用涉及到局部变量访问,变量n作用域f1函数块内,如果想在外部直接访问是不行的,下面在函数f1定义了一个内部函数f2,很巧妙避开了这个问题,由于f2是内部函数,可以直接访问变量n,而内部函数f2又作为f1的返回值.因此,它对外提供了访问f1的局部变量n。闭包就是函数f2,剖析到这里,想必大家都大概能理解闭包的含义了吧。闭包就是"一个函数的内部函数".它的最大特点是能记住所属内部函数的函数环境(f1的局部变量等)本质上,它是连接内部函数和外部函数的桥梁。

function f1() {
  var n = 666;
  function f2() {
    console.log(n);
  }
  return f2;
}

var result = f1();
result(); // 666

如此一来, n就像是f1的私有变量,外部不能直接访问,那从这个角度思考,闭包类似于java的私有变量,get method提供了对外访问功能。同样,闭包也可以运用在这个场景。

2.2 立即执行定义函数

假设定义了一个函数 iife_function ,然后你想马上调用它。这不是so easy么?直接 iife_function() 。

或许,你想当然想这样调用 function iife_function(){}();  但这种语法是错误的.JavaScript一律将function开头的解释成语句。

而方法的定义是不能以圆括号结束的。

所幸的是,JavaScript支持了下面的调用法。

格式大概是酱紫滴~ 将定义的函数iife_function 放在 圆括号()里面,再在后面加上 ()即可表示调用。

      
    (function iife_function() {
        console.log("iife");
    }());

OR

    (function iife_function2() {
        console.log("iife2");
    })();    

三、参考文献 

http://javascript.ruanyifeng.com/grammar/function.html#toc1

原文地址:https://www.cnblogs.com/chenmo-xpw/p/5989012.html