gpt4 book ai didi

JavaScript 类问题

转载 作者:行者123 更新时间:2023-11-28 12:08:46 25 4
gpt4 key购买 nike

检查此代码

    var _class=function()
{
this.Test=100;
this.Callback=function(msg)
{
alert(msg+"\r\n"+this.Test);
}
}

function run(call)
{
call("Hello world");
}

var obj=new _class();
run(obj.Callback);

我得到了结果:

    [Alert]
Hello world
undefined

但是当我打电话时 obj.Callback(" Hello World ")

我预料到了

    [Alert]
Hello world
100

为什么?

感谢帮助

最佳答案

对象和它“内部”定义的函数之间没有内在关系。在函数调用中,唯一决定 this(称为“接收”对象)的值的是函数调用的方式。

  • 使用 object.func() 调用函数,this 将绑定(bind)到 object
  • 使用“call()”或“apply()”调用函数,this 由第一个参数确定。
  • 但是,如果在没有任何隐式对象上下文的情况下调用函数,如“回调”示例中所示,则 this 将不会引用您的对象的 任何内容 - 它将引用 window (或任何全局上下文)。

诀窍是,当您想要像对象上的“方法”一样使用函数时,即使函数引用已从对象中拉出,关系也保持不变,您可以预先绑定(bind)有几种方式:

  1. 您可以将该函数包装在另一个函数中,以便在闭包中显式保留this
  2. 您可以使用“.bind()”(本质上)执行相同的操作。

第一种方式如下所示:

run(function() { obj.Callback(); });

第二种方式如下所示:

run(obj.Callback.bind(obj));

在这方面,JavaScript 与 C# 或 Java 等语言有很大不同。在这些语言中,函数在某种程度上永远停留在与其类(或其类的实例)的关系中。不是 JavaScript;事实上,函数在哪里定义并不重要。如果你的“_class”函数是这样写的,那么它是等效的:

function helloThere() { 
alert(msg + "\r\n" + this.Test);
}

var _class = function() {
this.Test = 100;
this.Callback = helloThere;
};

编辑 - @jamietre 正确地指出,如果您的“_class”函数包含一些 var 声明或本地函数,那么肯定会有差异(尽管不是)尊重调用“回调”时 this 的行为方式)。

再次编辑 - 谢谢@Koolinc

关于JavaScript 类问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6362478/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com