我刚刚玩JavaScript并创建构造函数,我遇到了这个令人困惑的代码。
var foo = function(){
this.x = 1;
return function(){
return this.x;
}
}
var x = new foo();
console.log(x);
我执行了以下操作:
console.log(x); // The given output is expected for this line of code
console.log(x());
console.log(x()());
console.log(x()()());
以上所有内容给出了与以下相同的输出:
function (){
return this.x;
}
有人可以解释上面代码中发生的事情。 我无法给出这个问题的正确标题。对不起。
注意:我很清楚JS中的构造函数。上面的代码只是出于好奇。
答案 0 :(得分:4)
长话短说 - 它没有做任何有用的事情。
如果构造函数返回一个对象,那么new
表达式生成的值就是该值而不是构造对象。因此,不是获取foo
的实例,而是获得一个返回this.x
的函数。
看起来这段代码正在尝试生成一个返回所创建对象的this.x
值的函数,但这并不是它所做的。由于您单独调用x()
,this.x
实际上是指全局 x
变量,因此无论您拨打x()()()
多少次,它只是回归自己。
如果您使用x
以外的任何变量名称且未创建x
变量(例如y
),则y()
将返回undefined
,y()()
会产生ReferenceError。
在严格模式下这也会很快失败,因为当你试图调用它时,函数内部的this
将引用undefined
。
答案 1 :(得分:0)
我的解释如下: x包含调用foo()的结果。
foo()返回一个函数:
function(){
return this.x;
}
此函数的主体被写入控制台
答案 2 :(得分:0)
以上是前一个答案的示例,演示了它:
var x = 5;
var foo = function(){
this.x = 1;
return function(){
return this.x;
}
}
var b = new foo();
b() //--> 5
答案 3 :(得分:0)
此代码全部与函数调用上下文有关。
在运行时,this
中引用的this.x = 1;
绑定到与this
return this.x;
不同的对象
x()
在全局上下文中调用foo返回的匿名函数。对于ECMAScript 3(及更早版本)环境,全局上下文函数调用将全局对象绑定到调用函数内的this
。因此,return this.x;
指的是您在全局对象上定义的var x
。
在ECMAScript 5中,use strict;
语句可以放在任何函数声明中,以“以这种方式”禁用全局对象的绑定。
匿名嵌套函数可以在闭包中访问“foo”this
:
var foo = function(){
this.x = 1;
var that = this;
return function(){
return that.x;
}
}
var x = new foo();
console.log(x); // function(){ ...
x(); // 1