几道JS闭包问题

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;  //可以返回各自差别的数值了
}
    原文作者:bottle_
    原文地址: https://segmentfault.com/a/1190000007009295
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞