改变';这';在javascript方法调用中?
这个问题的后续问题。我正在用Firebug调试这个改变';这';在javascript方法调用中?,javascript,html,object,Javascript,Html,Object,这个问题的后续问题。我正在用Firebug调试这个 function Fred() { this.a = 1; function foo() { if (a == 1) { a++; } var e = 0; } this.bar = function () { var a = 3; foo(); }; } 从一个HTML文件中,我创建了一个新的Fre
function Fred() {
this.a = 1;
function foo() {
if (a == 1) {
a++;
}
var e = 0;
}
this.bar = function () {
var a = 3;
foo();
};
}
从一个HTML文件中,我创建了一个新的Fred
实例,并调用bar()
。在Firebug中,在调用bar()
时,我可以在Watch视图中看到这是我的Fred
实例。当bar()
调用foo()
时,此
将更改为窗口的一个实例。我本以为这个
会保持不变
可能需要更多关于关闭的补救培训。使用或
第一个参数表示调用以下函数的上下文
e、 g
在JavaScript中,如果调用函数,此
指向的位置取决于调用的上下文
函数调用模式
如果将函数作为函数调用,即:
foo();
然后此
将引用全局上下文,在浏览器中表示窗口
对象
方法调用模式
相反,如果您像方法一样调用函数,即:
x.foo();
然后此
将引用调用函数的对象,即x
调用/应用调用模式
如果要将函数作为函数调用,并更改此
引用的内容,则可以使用调用
或应用
函数,例如
foo.call(x);
foo.apply(x);
两者都做相同的事情:调用foo
,就好像它是在x
上作为方法调用的一样。它们之间的区别在于当您想要移交参数时:call
要求您将它们指定为逗号分隔的列表,而apply
允许您移交数组:
foo.call(x, p1, p2, p3, ...);
foo.apply(x, [ p1, p2, p3, ... ]);
构造函数调用模式
为了完整起见,甚至还有第四个选项可以选择this
可能是什么:如果您将函数作为构造函数调用,this
指向新创建的对象:
new foo();
为了让每个人都明白这一点,在JavaScript中,您有一个最佳实践,即以大写字母开始函数名作为构造函数,即:
new Foo();
尽管如此,效果还是一样。在这里不是更合适吗?@JamesMcLaughlin是的,你是对的,两种方法都是一样的。还要感谢David清理了我的语法。你知道在这个例子中你有3个不同的
a
,对吗?一个是Fred的实例,一个是作用域到条
函数,另一个是来自更高的作用域,或者是来自窗口。a
。谢谢,这是有意的。我只是随便说说变量的定义和范围。谢谢你的详细解释。这正是我所期望的。但是,例如,从HTML中,我执行以下命令:var f=new Fred();f、 bar()代码>这`在bar()期间执行
是我的Fred
实例。有道理。但是从bar()
调用foo()
似乎是在上下文中,但是这个更改为窗口。下一次尝试,在bar()
中,如果this
是Fred
实例,请尝试this.foo()
。运气不好,未定义。太早按回车键。将foo()
更改为foo.call(this)
使我获得了想要的行为,但这似乎很笨拙。我正在做一个练习,它有许多带参数的内部私有方法。我应该提到的是,我是一个正在恢复的Smalltalk程序员。是的,一开始感觉很笨拙,但这正是JavaScript的工作方式,因此,这正是您应该习惯的。所以,基本上,如果你喜欢或不喜欢并不重要-这只是你必须在JavaScript中做的;-)。PS:如果我的回答解决了你的问题,如果你接受它作为答案,那就太好了;-)
new Foo();