function fun(n,o) {
console.log(o);
return {
fun:function(m){
return fun(m,n);
}
};
}
问:
三个fun函数是一样的吗?
答:
第一个fun是具名函数,可通过fun.name得到'fun',即函数名;返回值是一个对象字面量表达式,属于一个新的Object;
对象字面量里有一个叫fun的属性,该属性是一个匿名函数表达式,属于新创建的函数,所以第一个和第二个fun函数是不一样的;
匿名函数表达式又返回一个fun函数,我们可以知道这个函数肯定不是新创建的,那么它是指的第一个还是第二个呢?
这就涉及到函数作用域链的问题了。
全局环境中有一个函数fun(),fun()的局部环境中没有变量,所以第三个fun在局部环境中查询不到,就会向上查找,即在全局环境中找到。
所以第三个和第一个是同一个。
var name = "The Window";
var object = {
name: "My Object";
getName: function(){
return function(){
return this.name;
};
}
};
alert(object.getName()()); //"The Window"
每个函数在被调用时都会自动取得两个特殊变量:this和arguments。内部函数在搜索这两个变量时,只会搜索到其活动对象为止,因此永远不可能直接访问到外部函数中的这两个变量。
var name = "The Window";
var object = {
name: "My Object";
getName: function(){
var that = this; //把外部作用域中的this对象保存在一个闭包能够访问到的变量中,就可以让闭包访问该对象了
return function(){
return this.name;
};
}
};
alert(object.getName()()); //"My Object"
function createFunction(){
var result = new Array();
for(var i=0;i<10;i++){
result[i] = function(){
return i;
};
}
return result;
}
这个函数会返回一个函数数组,表面上看,每个函数都应该返回自己的索引值,但实际上每个函数都返回10。因为每个函数的作用域链中都保存这createFunction()函数的活动对象,所以它们引用的都是同一个变量i。当createFunction()函数返回后,变量i的值是10,此时每个函数都引用者保存变量i的同一个变量对象,所以在每一个函数内部i的值都是10.
function createFunction(){
var result = new Array();
for(var i=0;i<10;i++){
result[i] = function(num){
return function(){
return num;
};
}(i);
}
return result; //可以返回各自不同的数值了
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。