函数表达式--总结
函数表达式
1、(穿插对象)对象的定义:无需属性的结合。
2、关于this对象:在闭包中使用this对象可能会导致一些问题,this对象是在运行时基于函数的执行环境绑定的;在全局函数中,this等于window,而当函数被作为某个对象的方法调用的时候,this等于那个对象。不过,匿名函数的执行环境具有全局性,因此其this对象通常指向window。但有时候由于编写闭包的方式不同。这一点可能不明显。
3、每个函数在被调用的时候,其活动对象都会自动获取两个特殊变量,this和arguments。内部函数在搜索这两个变量的时候,只会搜索到其活动对象为止,因此永远不可能直接访问外部函数中的这两个变量。不过,把外部作用域中的this对象保存在一个闭包能够访问到的变量里,就可以让闭包访问该对象了。
4、模仿块级作用域:Js中是没有块级作用域这个概念的。这意味着在块级语句中定义的变量,实际上是在包含函数中而非语句中创建的。Js从来不会提醒你是否多次声明同一个变量,他会无视后面的而声明变量,但是它会执行后续声明之中的变量初始化。匿名函数可以用来模仿块级(私有)作用域并避免这个问题。
5、函数声明后面不可以加括号,但是可以将函数声明用括号括起来转变为函数表达式,他就可以在后面加括号了。
6、为了限制向全局作用域中添加过多的变量和函数。利用闭包。通过创建私有作用域,每个开发人员既可以使用自己的变量,又不用担心搞乱全局作用域。
(function () {
var now=new
Date();
if(now.getMonth()==3&&now.getDate()==7){
alert("css");
}
})();
上面这段代码可以获得今天是否是4月7日的判断案件。
7、js中是没有私有成员这个概念的,所有的对象属性都是公有的。不过,有一个私有变量的概念。任何函数中定义的变量,都可以认为是私有变量,因为不能再函数外部访问这些变量。私有变量包括函数的参数、局部变量和咋函数内部定义的其他函数。
function f1(num1,num2){
var sum=num1+num2;
}
这里num1和num2和sum是私有变量。如果在这个函数内部创建一个闭包,那么闭包通过自己的作用域链也可以访问这些变量。利用这一点,就可以创建用于访问私有变量的公有方法。
而有权访问私有变量和私有函数的公有方法叫做特权方法(privileged method)。公有两种在对象上创建特权方法的方式。第一种是在构造函数中定义特权方法。
function MyObject(){
//私有变量和私有函数
var privateVariable=10;
function privateFunction(){
return false;
}
//特权方法
this.publicMethod= function () {
privateVariable++;
return privateFunction();
};
}
在创建MyObject的实例后,除了使用publicMethod()这一途径,没有任何办法访问privateVariable和privateFunction();
利用私有和特权成员,可以隐藏那些不应该被直接修改的数据。
利用构造函数的方法的缺点是针对每个实例都会创建同样一组新方法。通过私有作用域中定义私有变量或函数,同样也可以创建特权方法。
(function () {
var privateVariable=10;
function privateFunction(){
return false;
}
//构造函数
MyObject= function () {
};
//特权方法
MyObject.prototype.publicMethod= function () {
privateVariable++;
return privateFunction();
};
})();
(初始化未经声明的变量,总会创建一个全局变量)。这个模式与构造函数中定义特权的方法的主要区别在于私有变量和函数是由实例共享的。