gpt4 book ai didi

javascript - 你能说这是 Javascript Closure 的正确示例吗?我们需要考虑避免闭包的地方在哪里?

转载 作者:行者123 更新时间:2023-11-29 18:37:00 26 4
gpt4 key购买 nike

问题与原因

我的一个队友最终陷入了在 javascript 中实现函数 Hook 的困惑局面。这是实际代码

 function ActualMethod(){   
this.doSomething = function() {
this.testMethod();
};

this.testMethod = function(){
alert("testMethod");
};
}


function ClosureTest(){
var objActual= new ActualMethod();
var closeHandler = objActual.doSomething;
closeHandler();
closeHandler.apply(objActual,arguments); //the fix i have added
this.ActualTest = function() {
alert("ActualTest");
};
}

在上面的代码中,var closeHandler 是在 ClosureTest() 的上下文中创建的,但它包含 ActualMethod.doSomething 的处理程序。每当调用 closeHandler() 时都会出现“对象不支持此方法”错误。

这是因为 doSomething() 函数调用了另一个内部方法 this.testMethod();。这里 this 指的是调用者的上下文而不是被调用者。所以我假设 closeHandler 绑定(bind)到实际创建的环境(ClosureTest)。即使它将处理程序保存到另一个上下文,它只是暴露了其自身上下文的属性。

解决方案

为了避免这种情况,我建议使用apply 来指定它需要执行的conext。

closeHandler.apply(objActual,arguments);

问题

它是关闭的完美场景..??

您在 javascript.. 中遇到闭包的有趣地方是什么?

更新

是的,它很简单,我可以直接调用该方法。但问题是,在特定情况下,我需要拦截对实际方法的调用并在此之前运行一些代码,最后执行实际方法..

举个例子,我正在使用第 3 方 aspx 网格库,所有鼠标点击事件都被它们的控件捕获。特别是通过鼠标单击分组,我需要拦截对他们的 ilbrary 方法的调用并 Hook 我的方法来执行并将调用重定向到实际的库方法

希望对你有帮助

最佳答案

更新:因为您可能在代码中遗漏了一些细节,所以很难在不遗漏实际代码要点的情况下将其改编成可行的东西。我确实认为我理解你描述的潜在问题。我希望以下内容有所帮助。

假设以下简单示例:

// Constructor function.
function Example() {
// Method:
this.method = function() {
alert("original method");
}
}

// You would use it like this:
var obj = new Example();
obj.method(); // Calls original method.

要拦截这样的方法调用,可以这样做:

function wrap(obj) {
var originalMethod = obj.method;
obj.method = function() {
alert("intercepted call");
originalMethod.apply(this, arguments);
}
return obj;
}

var obj = wrap(new Example());
obj.method(); // Calls wrapped method.

不幸的是,因为 method() 是在构造函数中定义的,而不是在原型(prototype)上,所以您需要有一个对象实例来包装对象。


原始问题的答案:doSomething() 函数用作使用 ActualMethod() 创建的对象的方法。您应该将它用作一种方法,而不是将其分离并用作不同上下文中的函数。为什么不直接调用该方法?

function ClosureTest(){
var objActual = new ActualMethod();
// Call method directly, avoid messy apply() calls.
objActual.doSomething();
this.ActualTest = function() {
alert("ActualTest");
};
}

如果在 Javascript 中将方法(某个对象上的函数)分配给局部变量并调用它,上下文将不同(this 的值发生变化)。如果您不希望它发生,请不要这样做。

关于javascript - 你能说这是 Javascript Closure 的正确示例吗?我们需要考虑避免闭包的地方在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2055641/

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