函数声明提升代表执行代码前会先读取函数声明
但函数表达式并不会被提前读取
编写递归函数时使用arguments.callee比使用函数名更保险,在严格模式下不能通过脚本访问arguements.callee,可以使用命名函数表达式来达成相同的结果
var factorial = (function f(num){
if (num <= 1){
return 1;
}else{
return num*f(num-1);
}
});
闭包是只有权访问另一个函数作用域中的变量的函数
function createFunctions(){
var result = new Array();
for (var i = 0; i < 10; i++) {
result[i] = function(num){
return num;
}(i);
};
return result;
}
通过在返回的函数里调用外部运行环境来返回相应运行环境内的变量
JS中没有块级作用域的概念,从它有定义开始,就可以在函数的内部随处访问它,即便重新定义也没啥用,而且也不会提醒你
模仿块级作用域的方法
(function(){
//这里是块级作用域
})();
当我们需要临时变量的时候就可以采用这种方法
任何在函数中定义的变量都可以认为是私有变量,有权访问私有变量和函数的被称为特权方法
function Person(name){
this.getname = function(){
return name;
};
this.setname = function(value){
name = value;
};
}
var person = new Person("A");
person.getname() //A
person.setname("B")
person.getname() //B
通过使用静态私有变量可以实现方法的共用来避免由于构造函数每个实例都会创建同样的一组方法
在这种方式下,私有变量和函数是由实例共享的,但特权方法定义在原型上,增进了代码复用但每个实例都没有了自己的私有变量
JS通过对象字面量的方式来创建单例对象,使用模块模式返回对象的匿名函数,返回的对象中只包含可以公开的属性和方法,这个对象是在匿名函数内部定义的,所以可以访问私有变量和函数,这个对象字面量定义的是单例的公共接口,可对单例进行某些初始化同时又可维护其私有变量
var application = function(){
var components = new Array();
components.push(new BaseComponent());
var app = new BaseComponent();
app.getComponentCount = function(){
return components.length;
}
app.registerComponent = function(component){
if (typeof components == "object"){
components.push(component)
}
};
return app;
}();