一、函数的执行顺序
function定义的函数会被优先初始化,其他未直接使用function关键字定义的函数不会被优先初始化,例如匿名函数。
参考代码
fn1(); //不会报错,对于通过function fn()这种写法来定义的函数,永远都会被最先初始化 function fn1(){ alert("fn1"); } fn2(); //使用如下方式定义函数,不会被先执行,如果在之前调用该函数就会报错 /** * 以下函数的定义方式是先在内存中创建了一块区域,之后通过一个fn2的变量指向这块区域 * 这块区域的函数开始是没有名称的,这种函数叫做匿名函数 */ var fn2 = function(){ alert("fn2"); }
二、函数的作用域
在js中进行函数调用,会为每一个函数增加scope函数,通过这个属性来指向一块内存,这块内存保存了父函数的作用域以及自己的作用域,因此形成一个链式结构。
参考代码1
var showColor = function(){
alert(this.color);
}
showColor中的scope变量指向的内存中包含两块作用域,分别是window和自己本身。
参考代码2:
function changeColor(){
var anotherColor = "blue";
function swapColor(){
var tempColor = anotherColor;
anotherColor = color;
color = tempColor;
}
swapColor();
}
changeColor中的scope变量指向的内存中包含3块作用域,分别是window、changeColor和自己本身。
参考代码3:
compareObjectFunction函数执行之后,prop变量并没有消失,在返回的匿名函数中仍然可以访问,原因是匿名函数保存了父函数的作用域,这就是闭包
function compareObjectFunction(prop){ //匿名函数 return function(obj1,obj2){ if(obj1[prop] > obj2[prop]) return 1; else if(obj1[prop] < obj2[prop]) return -1; else return 0; } } var o1 = {name:"Leon",age:23}; var o2 = {name:"Ada",age:28}; //调用 var compare = compareObjectFunction("name"); //执行 var re1 = compare(o1,o2); //输出 alert(re1);
三、块级用域
1.js没有块级作用域,如果需要使用块级作用域则需要将全局变量的代码放到一个匿名函数中,并且马上调用匿名函数,这样也可以执行全局变量的代码。
(function(){
for(var i = 0; i < 10; i++){
}
})();