一、函数的声明

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)); //

上面函数等价于

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(); //

如此一来, 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

最新文章

  1. 日志系统实战(一)—AOP静态注入
  2. 【C#】C# 队列,
  3. PHP写文件函数
  4. 谈谈JavaScript MVC模式
  5. 【leetcode】Gray Code (middle)
  6. JavaWeb学习之Servlet(三)----Servlet的映射匹配问题、线程安全问题
  7. BZOJ1035 : [ZJOI2008]Risk
  8. 基本STRUTS标签-学习笔记-Bean标签
  9. caffe+GPU︱AWS.G2+Ubuntu14.04+GPU+CUDA8.0+cudnn8.0
  10. js模块化 javascript 模块化 闭包写法 闭包模块化写法
  11. [Swift]LeetCode112. 路径总和 | Path Sum
  12. 能ping通虚拟机,但snmp报文 Destination unreachable(Host administratively prohibited
  13. java_oop_三大特性
  14. [Objective-C]用Block实现链式编程
  15. ORACLE等待事件:SQL*Net message from client & SQL*Net message to client
  16. .net core compatibility windows & windows compatible Linux
  17. nginx 配置白名单
  18. unity, texture import settings
  19. 1、关于python第三方工具操作xls和xlsx格式的excel文档选型的吐血经历
  20. os模块详解

热门文章

  1. ti processor sdk linux am335x evm /bin/create-sdcard.sh hacking
  2. django - 好的 获取 参数值 方法
  3. 多线程程序设计学习(2)之single threaded execution pattern
  4. 【js】js方法中直接跳转到servlet
  5. K2 学习笔记
  6. c# 利用反射动态给实体类对象赋值
  7. ch03-文字版面的设计
  8. HDU-4035 Maze
  9. POST 一张 图像的调试来认识 http post
  10. IOS-day01_OC中类的创建以及使用