Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 是否尝试创建返回函数的对象?_Javascript_Oop - Fatal编程技术网

Javascript 是否尝试创建返回函数的对象?

Javascript 是否尝试创建返回函数的对象?,javascript,oop,Javascript,Oop,我尝试了一些不同的东西,最终得到了这些代码 var f1 = function() { this.x = 10; this.innerf = function() { console.log(this.x); } } var of1 = new f1(); of1.innerf(); var f2 = function() { return function() {

我尝试了一些不同的东西,最终得到了这些代码

var f1 = function() {
             this.x = 10;
             this.innerf = function() {    console.log(this.x);   }
         }

var of1 = new f1();
of1.innerf();

var f2 = function() {
             return function() {
                 this.x = 10;
                 this.innerf = function() {    console.log(this.x);    }
             }
         }

var of2 = new f2();
of2.innerf(); 
这是投掷错误??!内部不是一个函数

所以,我的匿名函数将相同的函数体返回给我的变量。
为什么我仍然无法实例化

第一部分返回一个对象,您可以调用该对象的
innerf
方法

第二部分返回一个函数,如果调用该函数,该函数将返回一个对象。但你没有

这会奏效的。调用函数f2()。它的返回值是匿名函数。然后,使用
new()
,可以创建对象的实例

var f2=函数(){
返回函数(){
这是x=10;
this.innerf=function(){console.log(this.x);}
}
}
var of 2=新的(f2())();
of2.innerf();
//上面的两行也可以写成:
3constructor的变量=f2();//这将返回内部匿名函数。
变量of3=新的of3constructor();//这将通过调用匿名函数创建一个实例。

of3.innerf()第一部分返回一个对象,您可以调用该对象的
innerf
方法

第二部分返回一个函数,如果调用该函数,该函数将返回一个对象。但你没有

这会奏效的。调用函数f2()。它的返回值是匿名函数。然后,使用
new()
,可以创建对象的实例

var f2=函数(){
返回函数(){
这是x=10;
this.innerf=function(){console.log(this.x);}
}
}
var of 2=新的(f2())();
of2.innerf();
//上面的两行也可以写成:
3constructor的变量=f2();//这将返回内部匿名函数。
变量of3=新的of3constructor();//这将通过调用匿名函数创建一个实例。
of3.innerf()有效的示例:

直接创建它:

var f1 = function() {
    this.x = 11;
    this.innerf = function() {    
        console.log(this.x);   
    }
}
var of1 = new f1();
of1.innerf();
var f2 = function() {
    return new function() {
        this.x = 12;
        this.innerf = function() {    
            console.log(this.x);    
        }
    }
}

var of2 = f2();
of2.innerf(); 
var f3 = function() {
    return {
        x: 13,
        innerf : function() {
            console.log(this.x);
        }
    }
}

var of3 = f3();
of3.innerf(); 
从函数返回新对象:

var f1 = function() {
    this.x = 11;
    this.innerf = function() {    
        console.log(this.x);   
    }
}
var of1 = new f1();
of1.innerf();
var f2 = function() {
    return new function() {
        this.x = 12;
        this.innerf = function() {    
            console.log(this.x);    
        }
    }
}

var of2 = f2();
of2.innerf(); 
var f3 = function() {
    return {
        x: 13,
        innerf : function() {
            console.log(this.x);
        }
    }
}

var of3 = f3();
of3.innerf(); 
返回对象:

var f1 = function() {
    this.x = 11;
    this.innerf = function() {    
        console.log(this.x);   
    }
}
var of1 = new f1();
of1.innerf();
var f2 = function() {
    return new function() {
        this.x = 12;
        this.innerf = function() {    
            console.log(this.x);    
        }
    }
}

var of2 = f2();
of2.innerf(); 
var f3 = function() {
    return {
        x: 13,
        innerf : function() {
            console.log(this.x);
        }
    }
}

var of3 = f3();
of3.innerf(); 
另一个:

var f4 = function() {
    return function() {
         this.x = 10;
         this.innerf = function() {    
             console.log(this.x);    
         }
    }
}

var of4 = new (f2())();
of2.innerf(); 
请记住,当您在没有“new”关键字“this”的情况下调用函数时,指向声明函数的对象,在本例中为“window”

示例:

直接创建它:

var f1 = function() {
    this.x = 11;
    this.innerf = function() {    
        console.log(this.x);   
    }
}
var of1 = new f1();
of1.innerf();
var f2 = function() {
    return new function() {
        this.x = 12;
        this.innerf = function() {    
            console.log(this.x);    
        }
    }
}

var of2 = f2();
of2.innerf(); 
var f3 = function() {
    return {
        x: 13,
        innerf : function() {
            console.log(this.x);
        }
    }
}

var of3 = f3();
of3.innerf(); 
从函数返回新对象:

var f1 = function() {
    this.x = 11;
    this.innerf = function() {    
        console.log(this.x);   
    }
}
var of1 = new f1();
of1.innerf();
var f2 = function() {
    return new function() {
        this.x = 12;
        this.innerf = function() {    
            console.log(this.x);    
        }
    }
}

var of2 = f2();
of2.innerf(); 
var f3 = function() {
    return {
        x: 13,
        innerf : function() {
            console.log(this.x);
        }
    }
}

var of3 = f3();
of3.innerf(); 
返回对象:

var f1 = function() {
    this.x = 11;
    this.innerf = function() {    
        console.log(this.x);   
    }
}
var of1 = new f1();
of1.innerf();
var f2 = function() {
    return new function() {
        this.x = 12;
        this.innerf = function() {    
            console.log(this.x);    
        }
    }
}

var of2 = f2();
of2.innerf(); 
var f3 = function() {
    return {
        x: 13,
        innerf : function() {
            console.log(this.x);
        }
    }
}

var of3 = f3();
of3.innerf(); 
另一个:

var f4 = function() {
    return function() {
         this.x = 10;
         this.innerf = function() {    
             console.log(this.x);    
         }
    }
}

var of4 = new (f2())();
of2.innerf(); 

请记住,当您调用一个没有“new”关键字“this”的函数时,指向声明函数的对象,在这种情况下,“window”需要从内部函数返回外部函数。您还需要立即运行内部函数

jsFiddle:

这也解释了函数声明后的()

您需要将其从内部函数返回到外部函数。您还需要立即运行内部函数

jsFiddle:

这也解释了函数声明后的()

这个问题与jquery无关可怕的构造函数模式再次触动了无辜者。或者更确切地说是JavaScript范围和原型性质的可怕本质。是的@安马尔斯。。谢谢:)@Kyll每种语言都有一套语法和规则,最好是有建设性的评论@jusopi这与作用域或原型继承没有任何关系。这个问题与JQUERY没有任何关系可怕的构造函数模式再次打击了无辜者。或者更确切地说是JavaScript作用域和原型的可怕本质。是的@安马尔斯。。谢谢:)@Kyll每种语言都有一套语法和规则,最好是有建设性的评论@jusopi这与范围继承或原型继承没有任何关系。困惑:(:(…请详细说明一下。函数(一个函数的声明)和函数的结果(调用函数时得到的值)之间存在差异。您的第二个函数不返回其中匿名函数的实例,而是返回内部函数本身。您首先需要创建该内部函数的实例,然后才能调用其方法。我必须补充一点,我让这段代码在您的思维中显示错误,但它本身没有多大意义。我会ldn不知道这样做有什么好处。@Jyotirmay-对f2变量中的函数使用
new
将创建f2的实例。然后它将返回一个函数而不是实例对象。结果2将等于返回的函数。该函数没有
innerf
属性。如果要调用该函数,它将d也没有
innerf
属性,因为
不受范围限制。您必须在
of 2
值上再次使用
new
。但是,在
f2
上使用new没有任何意义,因为您只想在返回的函数上使用
new
。@ecarrizo-这将导致错误。“Uncaught TypeError:无法读取未定义的属性'innerf'。如果不使用
new
,就不会有可使用的实例,因此
将不适用于返回函数,而适用于窗口。换句话说,这将需要
var of 2=(f2())();window.innerf();//10
混淆:(:(…你能详细说明一下吗?函数(一个函数的声明)和函数的结果(调用函数时得到的值)之间有区别。您的第二个函数不返回其中匿名函数的实例,而是返回内部函数本身。您首先需要创建该内部函数的实例,然后才能调用它的方法。我必须补充一点,我让这段代码在您的思维中显示错误,但它本身没有多大意义。