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
混淆:(:(…你能详细说明一下吗?函数(一个函数的声明)和函数的结果(调用函数时得到的值)之间有区别。您的第二个函数不返回其中匿名函数的实例,而是返回内部函数本身。您首先需要创建该内部函数的实例,然后才能调用它的方法。我必须补充一点,我让这段代码在您的思维中显示错误,但它本身没有多大意义。