一道闭包的题

var name="window";
var obj={
        name:'obj',
        children:{
            name:'children',
            logName:function(){
                    alert(this.name)
                }
        }
    }
var logName=obj.children.logName;
logName();

问:

1.alert什么?

答:window。

2.修改obj的实现,怎么能alert:children

试着解答

var name="window";
 var obj={
        name:'obj',
        children:{
            name:'children',
            logName :(function(scope){//改了这里,弄了个闭包加进去了个作用域
                return function(){
                    alert(scope.name)
                }
                
            })(obj.children)
        }
    }
var logName=obj.children.logName;
logName();

这样会报错

var name="window";
var obj={};//改了这里,把obj先定义了
obj={ name:'obj', children:{ name:'children', logName :(function(scope){ return function(){ alert(scope.name) } })(obj.children) } } var logName=obj.children.logName; logName();

改成了这样,但是会报错

感觉貌似是因为对象还没定义完???

反正后来我改成这样好使了

var name="window";
var obj={
        name:'obj',
        children:{
            name:'children'
        }
    }
    obj.children.logName=(function(scope){//改了这里,把那个作用域在定义完再传进去
        return function(){
                    alert(scope.name)
                }
    })(obj.children)
var logName=obj.children.logName;
logName();

 再加一个

function child(){
    this.name='children';
    this.logName=(function(self){
        return function(){
            console.log(self.name)
        }
        
    })(this);
}
var logName=new child().logName;
logName();

传this就不会出现没有定义完的问题

原文地址:https://www.cnblogs.com/zqiong/p/6184661.html