一、基本定义

1.函数声明:使用function声明函数,并指定函数名。

function fun() {
// ......
}

2.函数表达式:使用function声明函数,但未指定函数名,将匿名函数赋予一个变量。

var fun = function() {
// ......
}

3.匿名函数:使用function声明函数,但未指定函数名。匿名函数属于函数表达式,匿名函数有很多作用,赋予一个变量则创建函数,赋予一个事件则成为事件处理程序或创建闭包等等。

function() {
// ......
}

二、实例补充

1. 函数声明可在当前作用域下提前调用执行,函数表达式需等执行到该函数后,方可执行,不可提前调用。

fun();
function fun() {
// ......
}
// 正确,函数声明可提前调用
fun()
var fun = function() {
// ......
}
// 错误,fun未保存对函数的引用,函数调用需放在函数表达式后面

2.函数表达式可直接在函数后加括号调用。

//传统方法
var fun1 = function() {
console.log('哈哈');
}
fun1(); //函数表达式后直接加括号调用
var fun2 = function() {
console.log('哈哈');
}()

3.立即执行函数(function(){})()的第一个小括号必须要加,因为如果不加第一个小括号的话,虽然匿名函数属于函数表达式,但未进行赋值,所以javascript解析时将开头的function当做函数声明,故报错提示需要函数名。加了第一个小括号,意思就是将函数声明转化为函数表达式。

//正确  
(function(){
console.log('哈哈');
})();
// 报错
function(){
console.log('哈哈');
}();

4.(function(){})()立即执行函数的注意点:在第一对括号内是一个匿名函数,第二个括号会立即调用这个匿名函数的返回值,也就是匿名函数中的内容被立即执行。这个玩意儿的强大之处在于它独立了一个作用域(括号中内容执行完后会被立即回收),内部变量外部无法访问,而它又能通过this保留字,来访问外部变量。好处:内部定义的变量不会跟外部的变量有冲突,达到保护内部变量的作用。

三、JavaScript变量提升的概念

变量提升:函数声明和变量声明总是会被解释器悄悄地被"提升"到方法体的最顶部。

1.变量可以在使用后声明,也就是变量可以先使用再声明。(因为函数声明和变量声明总是会被解释器悄悄地被"提升"到方法体的最顶部)

x = 5; // 变量 x 设置为 5
console.log(x); //正常输出5
var x; // 声明 x var y; // 声明 y
y = 5; // 变量 y 设置为 5
console.log(y); //正常输出5

2.JavaScript初始化不会提升。(JavaScript 只有声明的变量会提升,初始化的不会。)

var x = 1;  // 初始化 x
var y = 2; // 初始化 y
console.log(x); //正常输出1
console.log(y); //正常输出2 var a = 3; // 初始化 a
console.log(a); //正常输出3
console.log(b); //输出undefined
var b = 4; // 初始化 b

3.一个有趣的例子

var a = 1;  //初始化a为1
var b = 2; //初始化b为2 var fun=function(){
console.log(a); //undefined
var a = 22;
console.log(b); //undefined
var b;
}
fun();

为什么会得到上述结果呢?原因如下:

JavaScript 只有声明的变量会提升,初始化的不会。所以在function中,有var a = 22,这是初始化,变量的声明会提升,但是变量的值没有提升。有var b , 声明的变量会提升到function最开头,但因为没有赋值,所以会输出undefined。上述代码等价于:

var a = 1;  //初始化a为1
var b = 2; //初始化b为2
var fun=function(){
var a;
var b;
console.log(a); //undefined
a = 22;
console.log(b); //undefined
}
fun();

4.另一个有趣的例子

var a = 1;  //初始化a为1
(function(){
a=3;
console.log(a); //
var a;
})(); (function(){
console.log(this.a); //1
})(); var fun=function(){
console.log(this.a); //
}
fun();

关键:立即执行函数、函数表达式和函数声明能通过this保留字,来访问外部变量。

当然如果function函数内部没有声明外部已有变量的话,function函数内部可直接使用外部已有变量,不使用this保留字也是可以的。(函数声明、函数表达式、立即执行函数结果都是这样,原因应该是当在function函数内部没有找到定义的变量时,会自动扩大作用域,向上搜索给出的变量)

var a = 1;  //初始化a为1
(function(){
console.log(a); //1
})();
var fun=function(){
console.log(a); //
}
fun();

function(){}、var fun=function(){}和function fun(){}的区别的更多相关文章

  1. JS中var声明与function声明两种函数声明方式的区别

    JS中常见的两种函数声明(statement)方式有这两种: // 函数表达式(function expression) var h = function() { // h } // 函数声明(fun ...

  2. 在JS中关于堆与栈的认识function abc(a){ a=100; } function abc2(arr){ arr[0]=0; }

    平常我们的印象中堆与栈就是两种数据结构,栈就是先进后出:堆就是先进先出.下面我就常见的例子做分析: main.cpp int a = 0; 全局初始化区 char *p1; 全局未初始化区 main( ...

  3. jQuery中$(function(){})与(function($){})(jQuery)、$(document).ready(function(){})等的区别详细讲解

    1.(function($) {…})(jQuery); 1).原理: 这实际上是匿名函数,如下: function(arg){…} 这就定义了一个匿名函数,参数为arg 而调用函数时,是在函数后面写 ...

  4. jQuery中$(function(){})与(function($){})(jQuery)、$(document).ready(function(){})等的区别详细讲解 ----转载

    1.(function($) {-})(jQuery); 1).原理: 这实际上是匿名函数,如下: function(arg){-} 这就定义了一个匿名函数,参数为arg 而调用函数时,是在函数后面写 ...

  5. jQuery中$(function(){})与(function($){})(jQuery)、$(document).ready(function(){})等的区别详解

    1.(function($) {…})(jQuery); 1).原理: 这实际上是匿名函数,如下: function(arg){…} 这就定义了一个匿名函数,参数为arg 而调用函数时,是在函数后面写 ...

  6. Adding New Functions to MySQL(User-Defined Function Interface UDF、Native Function)

    catalog . How to Add New Functions to MySQL . Features of the User-Defined Function Interface . User ...

  7. Mysql drop function xxxx ERROR 1305 (42000): FUNCTION (UDF) xxxx does not exist

    mysql> drop function GetEmployeeInformationByID;ERROR 1305 (42000): FUNCTION (UDF) GetEmployeeInf ...

  8. js页面加载的几种方式的速度: window.onload、 $(window).load、 $(function(){})、 $(document).ready(function () {})、onload=‘asd()’

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  9. 洛谷P1464 Function  HDU P1579 Function Run Fun

    洛谷P1464 Function HDU P1579 Function Run Fun 题目描述 对于一个递归函数w(a,b,c) 如果a≤0 or b≤0 or c≤0就返回值11. 如果a> ...

  10. 轻松弄懂var、let、const之间的区别

    ECMAScript 6(简称ES6)是JavaScript语言的下一代标准,于2015年6月正式发布,也称ECMAScript 2015. ES6的好处 ES6的出现为我们前端带来了很多方便之处,以 ...

随机推荐

  1. 鼠标交互插件threex.domevents介绍

    threex.domevents是一个three.js的扩展库,支持3D场景的交互.和我们操作DOM树的事件相似,名称都是一样的.所以使用起来非常方便.另外他也提供了连接操作.单击网格可实现跳转功能. ...

  2. 利用PowerShell监控Win-Server性能

    Q:如何系统层面的去监控一下Windows Server? A:额……一时间的话……能想到的可能也就是PowerShell+SQL Server+job,试试. 1.关于PowerShell 2.Po ...

  3. Excel导入工具类兼容xls和xlsx

    package com.bj58.finance.platform.operation.provider.util; import org.apache.log4j.Logger; import or ...

  4. 【thinkphp5】安全建议:隐藏后台登录入口地址

    我们都知道后台   www.test.com/admin 是我们最常用的登录入口,方便的同时也留下了隐患,如果你刚好使用了 admin/ 这种账号密码的方式,会导致我们的后台完全暴露在外. 因此我们建 ...

  5. 微信小游戏下socket.io的使用

    参考: 微信小游戏:socket.io 一 在微信小游戏 中使用socket.io报错 因为项目需求,后端要使用nodejs简单搭建一个服务器,通讯用json格式. 使用Egret提供的socket. ...

  6. mysql之表格的关联关系

    1.’基本模式有多对一,多对多,一对一.关联的两个基本组建为外键列和参照列 典型的多对一模式,很普遍,如部门表和员工表,即一个部门可以有多个员工. 对于多对多的模式,就需要建立中间表,将其转换为多对一 ...

  7. 使用Bitsadmin 命令下载文件

    如果你碰到一个 Sa权限的注入点,你可以执行dos命令,但是你发现站库分离,数据库和web不在一个服务器上,而且悲剧的是数据库服务器又是个内网,这个时候你该怎么办? 这里就需要用到Bitsadmin来 ...

  8. 防止xss和sql注入:JS特殊字符过滤正则

    function stripscript(s) { var pattern = new RegExp("[%--`~!@#$^&*()=|{}':;',\\[\\].<> ...

  9. loadrunner笔记(二):飞机订票系统--客户信息注册

    (一)  几个重要概念说明 集合点:同步虚拟用户,以便同一时间执行任务. 事务:事务是指服务器响应用户请求所用的时间,当然它可以衡量某个操作,如登录所需要的时间,也可以衡量一系列的操作所用的时间,如从 ...

  10. mysql: [Warning] Using a password on the command line interface can be insecure. ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

    错误情况 解决办法: 首先查看mysql的命令 其次修改root用户的密码 set password for 'root'@'localhost' = password('123456'); 最后退出 ...