1、函数是一个对象。
var add = new Function('a,b','return a + b');
因为函数是可以new的,每一个函数都是Function对象的一个副本。
当然,从来不会有人刻意的去这样创建一个函数。
也正是由于函数是一个对象,所以函数可以有自己的属性和方法。
2、JavaScript中仅存在函数级别的作用域。
2-1、花括号对于定义作用域是没有意义的。
以for循环的花括号为例说明:
############################
for(var i = 0; i < 1 ; i++){
var inner = "我是内部变量??"
};
console.info(inner)
############################
这段代码可以输出inner的值。
2-2、只要在函数内部定义的变量都可以被整个函数访问。
无论在哪里声明,例如:
############################
(function add(){
console.info(a);
var a = 10;
})();
############################
被()()包裹起来,只是为了自动执行。
和如下方法一致,只是为了少些一些代码而已:
############################
function add(){
console.info(a);
var a = 10;
}
add();
############################
上面这段代码打印的结果是undefined,而不是报错Error。
undefined的含义是定义了,但是还没有赋值罢了。
Error才是错误,undefined和错误没有任何关系。
可见JavaScript中函数内部变量的声明会被提前,但是赋值不会被提前。
原因在于JavaScript编译的方法所致,具体请自行百度吧。
3、既然函数是一个对象,那么他就可以被用来当作参数和返回值。
############################
var f1 = function(){
return "我是f1";
}
var f2 = function(f1){
return f1;
}
var f3 = f2(f1);
console.info(f3());
############################
我们发现f1这个函数确实可以作为参数和返回值。
通常我们把f1命名成callback,也许你就明白了回调函数就是这么一回事。
4、由于函数是一个对象,所以函数可以像普通变量一样被赋值。
############################
var f1 = function(){
return "我是f1";
}
console.info(f1());
f1 = function(){
return "我是被覆盖的f1"
}
console.info(f1());
############################
5、即时函数是创建完函数后立马执行。
上面谈到过这种形式
############################
(function add(){
console.info(a);
var a = 10;
})();
############################
其实下面这种形式也一样,只是写法上稍有不同。
############################
(function add(){
console.info(a);
var a = 10;
}());
############################
即时函数可以存在参数。
############################
var i = 10;
(function(w){
console.info(w.i);
})(window);
############################
对于即时函数来说,个人感觉有没有函数的名称无所谓。
即时函数可以有返回值。
############################
var result = (function(){
return 2 + 2;
})();
console.info(result);
############################
绝大多数框架都使用到了即时函数,
因为它可以包装很多执行的工作,
而且不会在留下任何全局变量。