1

我有这个代码:

function boo() {
    this.is_global = "Yes!";
}

当我运行时boo();,我有is_global对象window,我的意思是is_global进入全局上下文。
我预计is_global只有boo功能。

这是正常行为吗?

4

4 回答 4

5

是的,这是正常行为。如果您的函数是全局定义的,那么thisis justwindow并且添加的任何内容window都是全局的。

于 2012-11-03T19:24:37.950 回答
2

this指窗户。如果要引用该函数,请使用:

arguments.callee.is_global = "Yes!";

现在:

window.is_global; //undefined
boo.is_global; //"Yes!"

另一种方法是在向 boo 添加属性时简单地通过其自己的名称引用 boo。

function boo() {
    boo.is_global = "Yes!";
}

请注意,这会修改原始boo函数对象。如果您希望修改所有将其用作构造函数的结果实例,请在此处查看其他答案。boo

于 2012-11-03T19:25:08.983 回答
1

this成为“被调用的函数”,您必须将该函数作为对象构造函数调用(使用new)。

var foo = new boo();

这将创建一个具有属性的实例。这不会在构造函数本身上创建属性。查看演示boois_global

如果您不使用new(或诸如 之类的方法apply),this则为“调用函数的对象”。由于在这种情况下没有对象,因此使用默认对象。在 Web 浏览器的上下文中,默认对象是window. 所以:

var foo = boo();

是相同的

var foo = window.boo();

并且thiswindow里面boo

于 2012-11-03T19:26:28.517 回答
1

查看MDN 对this关键字的介绍。

我猜你想声明一个局部变量,所以使用一个var语句

于 2012-11-03T19:27:14.230 回答