标签:javascrip key 转化 闭包 代码 keyword 命名空间 概念 aaa
函数基本概念:
函数声明: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内部变量的作用。
标签:javascrip key 转化 闭包 代码 keyword 命名空间 概念 aaa
原文地址:http://www.cnblogs.com/yelongsan/p/7541430.html