}());
2、下列哪个结果是正确的?(A、B、C、D)
A.(function(a1,a2){
alert(“Here!”+(a1+a2));
})(1,2);
B.(function(a1,a2){
alert(“Here!” +(a1+a2));
}(1,2));
C.void function(a1,a2){
alert(“Here!” +(a1+a2));
}(1,2);
D.var f = function(a1,a2){
alert(“Here!” +(a1+a2));
}(1,2);
注:A 、B、C与D四种格式都正确,前两者属于同种情况的不同写法,后两种是将函数对象的返回值赋给其他变量,C是忽略函数返回值,而D正相反!
具体举个例子:
function test(){
return (function(p1,p2){
return p1+p2;
})(1,2);
};
(function(){
alert(test());
}());
下面我们就深入研究一下这种匿名函数:
1、
①
function Foo() {
var a = 123;
this.a = 456;
(function() {
alert(a); // 123
alert(this.a); // undefined
})();
};
var f = new Foo();
②
function Foo() {
var a = 123;
this.a = 456;
(function(_this) {
alert(a); // 123
alert(_this.a); // 456
})(this);
};
var f = new Foo();
以上两个对比,说明:
(1)匿名函数可以直接访问到外层署名函数(Foo)中的变量(使用关键字var定义的),但不能访问外层署名函数的属性(使用关键字this定义的);
(2)匿名函数中的this指向的是匿名函数对象的地址,它与外层署名函数(Foo)对象的this指向的地址不同;
(3)匿名函数若要访问外层署名函数(Foo)中的属性,可以通过参数传递的方式实现。
2、
①
function Foo() {
var a = 123;
this.a = 456;
(function(b) {
alert(a); // 123
alert(b); // 456
})(this.a);
};
var f = new Foo();
②
(function() {
var a = 123;
this.a = 456;
(function() {
alert(a); // 123
alert(this.a); // 456
})();
})();
以上两个对比,说明:
(1) 匿名函数既可以直接访问外层匿名函数中的变量,又直接可以访问外层匿名函数中的属性,而匿名函数却不可以直接访问外层已命名函数中的属性;
(2)以上两种方式可以实现相同的功能。
3、
①
(function() {
var a = 123;
this.a = 456;
(function() {
alert(a); // 123
alert(this.a); // 456
this.b = 789;
})();
(function() {
alert(this.b); // 789
})();
})();
(function() {
alert(this.a); // 456
alert(this.b); // 789
})();
②
function Foo() {
var a = 123;
this.a = 456;
(function() {
alert(a); // 123
alert(this.a); // undefined
this.b = 789;
})();
(function() {
alert(this.b); // 789
})();
};
var f = new Foo();
(function() {
alert(this.a); // undefined
alert(this.b); // 789
})();
以上两个对比,说明:
(1)匿名函数(即用两个小括号括起来的部分)位于一个执行上下文,不论这些代码放在哪个位置上。
4、
①
function Foo() {
(function() {
this.b = 789;
})();
(function() {
alert(this.b); // 789
alert(b); // 789
var a = 0;
alert(a); // 0
})();
}
var f = new Foo();
(function() {
alert(this.b); // 789
alert(b); // 789