function foo(){}、(function(){})、(function(){}())等函数区别分析
前面一段时间,看到(function(){}),(function(){}())这些函数就犯晕,不知道它到底是什么意思,为什么函数外要加小括号,函数后要加小括号,加和不加到底有什么区别……一直犯迷糊,看了汤姆大叔的《深入理解JavaScript系列(4):立即调用的函数表达式》后才明白它们到底是什么东西,终于将困扰我已久的东西给干掉了。
在这里,我先介绍一下函数引用和函数调用的差别、函数声明表现形式和函数表达式的表现形式。
一、函数引用和函数调用的差别
函数引用和调用的差别与函数名称后是否有小括号()有关,函数引用只会单独出现,但函数调用后面必定会带有一个小括号,很多时候还附有自变量。
表示方式(举例说明):
function foo(){
//函数体
}
var f = foo; //函数引用
var ff = foo(); //函数调用,可直接调用foo(),也可调用f()
二、函数声明的表现形式
带有函数名的函数是函数声明,包括保留字function,函数名(必有),圆括号中的参数(可有可无)和花括号中的函数主体。
表示方式(举例说明):
function foo(str){
//函数体
}
三、函数表达式的表现形式
赋值函数,函数外带有小括号的函数是函数表达式(就举两个例子),包括赋值变量(可有),函数外小括号(可有),保留字function,函数名(可有可无),圆括号中的参数(可有可无)和花括号中的函数主体。
表示方式(举例说明):
//赋值型函数表达式
var f = function foo(str){
//函数体
}
//分组括号型函数表达式,这是立即执行函数表达式,后面会讲解
(function(){
//函数体
})();
四、函数实例
第一种:
var foo = function(){}
分析:该函数为函数表达式,也可以理解成是一个引用,用foo()调用可执行。
第二种:
var foo = function(){}();
分析:该函数为立即调用函数,这和第一种的区别就是后面有无小括号,也就是函数调用和函数引用的区别,函数调用可理解为自执行函数(最好在function(){}外加一个括号变成(function(){})(),更规范一点);
第三种:
function(){}
分析:该函数缺少名称,未赋值,所以报错。
第四种:
function(){}()
分析:function(){}是语句,不是函数表达式,只有表达式才能调用,所以报错。
第五种:
(function(){})();
分析:(function(){})是函数表达式,能调用,称为匿名自执行函数。
第六种:
(function(){}());
分析:(function(){}())是函数表达式,可用,称为匿名自执行函数(汤姆大叔推荐的写法,我更喜欢第五种写法)。
第七种:
function foo(){}
分析:该函数为实名函数,可调用。
第八种:
function foo(){}();
分析:解释和第四种一样,因为function foo(){}是语句,不是表达式,不能调用,所以报错。
第九种:
function foo(){}(a);
分析:解释和第四种一样,因为function foo(){}是语句,不是表达式,不能调用,但是因为后面括号中传入了参数,所以未抛出异常,也就为报错,但是本身还是不执行的。
第十种:
(function foo(){});
分析:function外添加一个括号,所以外部作用域就不能调用foo()这个函数了,里面被当做匿名函数了,我个人认为这样的函数没什么意义,既不能调用也不能自执行。
第十一种:
(function foo(){})();
分析:有了十,这个就可以理解为是匿名自执行函数了。但是在ie8以下能执行,该表达式被当做函数声明,函数声明有种“置顶解析”的行为,就是不管函数在哪个地方定义,它都会在该作用域顶部默认声明好。
第十二种:
!function(){}();
分析:其实小括号和js的&&,异或,感叹号等操作是在函数声明和表达式消除歧义的,为可执行的。
第十三种:
new function(){}();
分析:可执行。
最后,非常感谢。有哪里讲解的不好或者是不正确的地方,希望大家能第一时间反馈给我,希望和大家共同进步~
function foo(){}、(function(){})、(function(){}())等函数区别分析的更多相关文章
- JS字符编码函数区别分析
http://www.jb51.net/article/14657.htm js对文字编码有3个函数: escape,encodeURI,encodeURIComponent, 对应的解码函数:une ...
- JavaScript 中,定义函数时用 var foo = function () {} 和 function foo() {}有什么区别?
对于新手来说(本人也是新手-_-!),好像var foo = function () {} 和 function foo(){}并没有什么区别,意识里可能就认为就是两种不同的写法而已.但是,通过网上查 ...
- JS中的函数声明和函数表达式的区别,即function(){}和var function(){},以及变量提升、作用域和作用域链
一.前言 Uncaught TypeError: ... is not a function function max(){}表示函数声明,可以放在代码的任何位置,也可以在任何地方成功调用: var ...
- 有具体名称的匿名函数var bar = function foo(){}
http://kangax.github.io/nfe/ 命名的函数表达式 函数表达式实际上可以经常看到.Web开发中的一个常见模式是基于某种特性测试来"分叉"函数定义,从而获得最 ...
- javaScript的函数(Function)对象的声明(@包括函数声明和函数表达式)
写作缘由: 平时再用js写函数的时候,一般都是以惯例 function fn () {} 的方式来声明一个函数,在阅读一些优秀插件的时候又不免见到 var fn = function () {} 这种 ...
- var abc = function(x){} 和 function abc(x){}的区别
转自百度知道. 问:js里声明函数有几种方式? var abc = function(x){} 和 function abc(x){} 这两种声明方法有什么不同? 答:首先后者是指函数声明,前者是指函 ...
- (C/C++) Callback Function 回调(diao)函数
原文: http://www.codeguru.com/cpp/cpp/cpp_mfc/callbacks/article.php/c10557/Callback-Functions-Tutorial ...
- JavaScript中Function Declaration与Function Expression 或者说 function fn(){}和var fn=function(){} 的区别
JavaScript是一种解释型语言,函数声明会在JavaScript代码加载后.执行前被解释,而函数表达式只有在执行到这一行代码时才会被解释. 在JS中有两种定义函数的方式, 1是:var aaa= ...
- (function($){...})(jQuery)与$(function(){...})区别
$(function(){...}) 这种写法和jQuery(function(){...}),$(document).ready(function(){...})作用一样,表示文档载入后需要运行的代 ...
随机推荐
- 使用DOM动态创建标签
本文是参考<javascript Dom 编程艺术>第八章的内容所写,用到的知识点,就是关于创建平稳的web页面. 使用DOM方法: getElementById() getElement ...
- HTML5——将图片拖拽上传
如下图所示: 代码如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
- Javascript继承机制的设计
写软工作业时各种蛋疼:主要在于Javascript没有“子类”“父类”“接口”的概念,只能使用prototype来实现,看了下面一篇文章,感觉写得很不错~ http://www.ruanyifeng. ...
- tomcat 的安装
安装tomcat的前提: 首先要做的是有java环境,这里我们可以选择安装jre(java环境包).或者说安装java开发工具包ldk 我这里选择安装jdk 我们在google里搜索jdk,你就能都找 ...
- php 判断是否get传值的参数是否存在
if(is_array($_GET)&&count($_GET)>0)//先判断是否通过get传值了 { if(isset($_GET["id&qu ...
- ES6 你可能不知道的事 – 基础篇
序 ES6,或许应该叫 ES2015(2015 年 6 月正式发布),对于大多数前端同学都不陌生. 首先这篇文章不是工具书,不会去过多谈概念,而是想聊聊关于每个特性 你可能不知道的事,希望能为各位同学 ...
- mysql实用教程的数据构造
create database XSCJ; use XSCJ; create table XS ( 学号 ) primary key not null, 姓名 ) not null, 专业名 ), 性 ...
- BZOJ2654 tree
Description 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. Input 第一行V,E,need分别表示点数,边数和需要的白色 ...
- PowerDesigner逆向工程从现有数据库生成PDM
如题,我想对于一个旧系统或者帮别人的系统进行擦屁股时,数据库设计以及关系都是非常好的切入点: 使用这个方法的前提,就是在数据库设计中,已经有明确的主外键关系(这里只针对中小型设计,业务逻辑强的,对于特 ...
- Xcode的一些有用的插件
** --Alcatraz:Xcode插件管理 ** 安装:curl -fsSL https://raw.github.com/supermarin/Alcatraz/master/Scripts/ ...