JavaScript函数和作用域

---恢复内容开始---

一、创造函数的三种方式:
   1、函数声明:function add(a,b){...}
   2、函数表达式:
      匿名式:var add=function(a,b){...}
      命名式:var add=function foo(a,b){...}
      立即执行:(function(){...})();
      返回值:return function(){...};
3、函数构造器:var func=new Function(...)    函数体里的变量是局部变量     不常用
二、函数声明可以在任何位置调用,函数表达式只能在其之后调用
三、命名函数表达式(NFE):调试|递归调用     不常用 

 

 

 

闭包中的易错点:

document.body.innerHTML = "<div id=div1>aaa</div>"
+ "<div id=div2>bbb</div><div id=div3>ccc</div>";
for (var i = 1; i < 4; i++) {
document.getElementById('div' + i).
addEventListener('click', function() {
alert(i); // all are 4!
});
}
document.body.innerHTML = "<div id=div1>aaa</div>"
+ "<div id=div2>bbb</div><div id=div3>ccc</div>";
for (var i = 1; i < 4; i++) {
!function(i) {
document.getElementById('div' + i).
addEventListener('click', function() {
alert(i); // 1, 2, 3
});
}(

 作用域链

function outer2() {
var local2 = 1;
function outer1() {
var local1 = 1;
// visit local1, local2 or global3
}
outer1();
}
var global3 = 1;
outer2();
function outer() {
var i = 1;
var func = new Function("console.log(typeof i);");
func(); // undefined}
outer();

 

函数初始化阶段顺序:
1. 函数参数初始化,如果没有传入实参,初始化该参数值为undefined. 
2. 函数声明 ,如果发生命名冲突,会覆盖 上另一个命名。
3. 变量声明, 初始化变量的值都为 undefined. 若发生命名冲突会被忽略。
posted @ 2017-10-29 19:28  风若雅若  阅读(102)  评论(0)    收藏  举报