改变';这';在javascript方法调用中?

改变';这';在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

这个问题的后续问题。我正在用Firebug调试这个

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();