函数基本概念:

函数声明:function box(){}

函数表达式:var box = function(){};

匿名函数:function(){} 属于函数表达式

    匿名函数的作用:如果将匿名函数赋值给一个变量,则声明了一个函数: var box= function(){};

            如果将匿名函数赋予一个事件则成为事件处理程序: box.addEventListener("click",function(){alert("aaa")});

            创建闭包:(function(){})()

函数定义的三种方法:

  var box = function(){};

  function box(){}

  var box = new Function();

函数声明和函数表达式的不同:

  js在进行预解析时函数声明会提升,而函数表达式必须js顺序执行到此函数代码时才会逐行解析

  函数表达式后面加括号可以立即执行函数,函数声明不可以,只能以fnName()的方式调用才行

  实例:

1
2
3
4
box();
function box(){
  alert("aaa"); 
}<br>//正常,因为js在解析阶段函数声明会被提升到最前面,所以函数声明可以在函数执行后面<br>//实际顺序<br>//function box(){<br>  alert("aaa");<br>}<br>//box();<br><br>box();<br>var box = function(){<br>  alert("aaa");<br>}<br>//报错,实际上的顺序是<br>//var box = undefined;<br>//box();<br>//box = function(){<br>  alert("aaa");<br>}<br>//所以当执行到box()时,此时box不是一个函数<br><br>var box = function(){<br>  alert("aaa");<br>}()<br>//正确 函数表达式后面加括号,当执行到后面的括号时js会自动执行此函数<br><br>function box(){<br>  alert("aaa");<br>}()<br>//不会报错,但是只会解析函数声明,忽略后面的括号,不会自执行<br><br>function(){<br>  alert("aaa")<br>}()<br>//语法错误<br>//虽然匿名函数属于函数表达式,但未进行赋值给一个变量<br>//当js解析到function时,将其看成函数声明,报错,需要一个函数函数名

 函数自执行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
(function(a){
  alert(a); 
})("123")
 
//"123" 使用()运算符
 
(function(a){
  alert(a); 
}("123"))
 
//"123" 使用()运算符
 
!function(a){
  alert(a);
}("123")
//"123" 使用!运算符<br><br>+function(a){<br>  alert(a);<br>}("123")<br>//"123" 使用+运算符<br><br>-function (a){<br>  alert(a);<br>}("123")<br>//"123" 使用-运算符<br><br>var fn= function(a){<br>  alert(a);<br>}("123")<br>//"123" 使用=运算符

  在function前面加!、+、-、=都可以将函数声明转化为函数表达式,消除了js引擎识别函数声明和函数表达式的歧义,

加()是最安全的方法,免得其他的和函数返回值进行运算

不过这样的写法有什么用呢?

javascript中没用私有作用域的概念,如果在多人开发的项目上,你在全局或局部作用域中声明了一些变量,可能会被其他人不小心用同名的变量给覆盖掉,

根据javascript函数作用域链的特性,可以使用这种技术可以模仿一个私有作用域,用匿名函数作为一个“容器”,

“容器”内部可以访问外部的变量,而外部环境不能访问“容器”内部的变量,

所以( function(){…} )()内部定义的变量不会和外部的变量发生冲突,俗称“匿名包裹器”或“命名空间”。

JQuery使用的就是这种方法,将JQuery代码包裹在( function (window,undefined){…jquery代码…} (window)中,在全局作用域中调用JQuery代码时,可以达到保护JQuery内部变量的作用。

js 自函数的更多相关文章

  1. JS回调函数全解析教程

    转自:http://blog.csdn.net/lulei9876/article/details/8494337 自学jQuery的时候,看到一英文词(Callback),顿时背部隐隐冒冷汗.迅速g ...

  2. 学习js回调函数

    <!DOCTYPE HTML> <html> <head> <meta charset="GBK" /> <title> ...

  3. 如何理解JS回调函数

    1.回调函数英文解释: A callback is a function that is passed as an argument to another function and is execut ...

  4. Atitit java方法引用(Method References) 与c#委托与脚本语言js的函数指针

    Atitit java方法引用(Method References) 与c#委托与脚本语言js的函数指针   1.1. java方法引用(Method References) 与c#委托与脚本语言js ...

  5. 【转】关于URL编码/javascript/js url 编码/url的三个js编码函数

    来源:http://www.cnblogs.com/huzi007/p/4174519.html 关于URL编码/javascript/js url 编码/url的三个js编码函数escape(),e ...

  6. js引出函数概念的案例

    js引出函数概念的案例   1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8&q ...

  7. prototype.js $F()函数介绍

    $F()是一个能够简化编码量的函数, 对于字段输入控件有效,包括input.textarea.select等,该函数的输入参数为这些输入控件元素对象的id或元素对象本身,函数负责返回 这些输入控件元素 ...

  8. JS匿名函数的理解

    js匿名函数的代码如下:(function(){ // 这里忽略jQuery 所有实现 })(); 半年前初次接触jQuery 的时候,我也像其他人一样很兴奋地想看看源码是什么样的.然而,在看到源码的 ...

  9. js回调函数(callback)理解

    Mark! js学习 不喜欢js,但是喜欢jquery,不解释. 自学jquery的时候,看到一英文词(Callback),顿时背部隐隐冒冷汗.迅速google之,发现原来中文翻译成回调.也就是回调函 ...

  10. JS回调函数(callback)

    在使用Jquery的时候,用到Callback(),回调函数的概念.而且很多. 比如: $.ajax({ url:"test.json", type: "GET" ...

随机推荐

  1. 怎样用modelsim做后仿真

    摘要: 怎样用modelsim做后仿(编译工具采用quatus) step1:在qurtus改变编译选项:     assignments->EDA tool setting:选择verilog ...

  2. Django:Django Rest Framework

    Django Rest Framework   一. 什么是RESTful REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称 ...

  3. 把UIView转成UIImage,解决模糊失真问题

    近期工作中,遇到一个需求,须要把一个UIView对象转成UIImage对象显示.经过网络搜索.找到例如以下答案: ? 1 2 3 4 5 6 7 8 -(UIImage*)convertViewToI ...

  4. SourceInsight-查看java中接口对应的实现类

    1.双击选中需要查看的接口名称,然后右击选择“Show in Relation Window” 2.然后在右侧会弹出一个Relation的窗口 如果没有列出对应的实现类,可以在接口名上再次右击,依次选 ...

  5. C#反射机制学习总结

    反射的定义:审查元数据并收集关于它的类型信息的能力.元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等. Syste ...

  6. Java、MySQL - 前补0的方法

    前补0的格式化方式在业务系统中经常使用,记录下此api. Java: public static void main(String[] args) { // 0002 System.out.print ...

  7. centos启动zookeeper

    切换到zookeeper的bin目录下,执行 ./zkServer.sh start

  8. USB设备驱动程序学习笔记(二)

    一.usbmouse_as_key.c /* * drivers\hid\usbhid\usbmouse.c */ #include <linux/kernel.h>#include &l ...

  9. 使用B或BL跳转时,下一条指令的地址的计算

    .text .global _start 3_start: b step1 step1: ldr pc, =step2 step2: b step2 反汇编代码: : eaffffff b 0x4 : ...

  10. GNU风格 ARM汇编语法1

    汇编源程序一般用于系统最基本的初始化:初始化堆栈指针.设置页表.操作 ARM的协处理器等. 这些初始化工作完成后就可以跳转到C代码main函数中执行. 1.GNU汇编语言语句格式 任何Linux汇编行 ...