【问题标题】:Function context in JavaScriptJavaScript 中的函数上下文
【发布时间】:2013-07-02 17:54:55
【问题描述】:

我想实现类似的东西:

函数someFunction 有一个方法.lockThis(<object>) 并且在第一次调用时:

var foreverThis = {};

someFunction.lockThis(foreverThis);  

// ... or
// someFunction = someFunction.lockThis(foreverThis);

它会将此函数绑定到<object>,以便下一次(或任何其他)此函数通过 as-function 或 as-method 调用或通过 apply/call 执行 - 它最初会给出 @987654326 @ 就像这样。

当然,我可以定义Function.prototype.lockThis,它将通过.apply()/call() 调用函数并将给定对象指定为上下文,但是如果有人通过@ 调用它,仍然可以替换someFunction 的上下文987654330@也一样。

有没有办法在 JavaScript 中锁定函数上下文,使其总是提供对象为 this 而无需更改函数本身的代码?

【问题讨论】:

  • 所以你实际上是在努力做到这一点,如果你这样做someFunction.lockThis(something),每隔一次你调用someFunction,无论它在代码中的什么位置,它都会假装它正在做@ 987654334@?
  • @SamuelReid,是的,像这样
  • 根据您删除的问题:$(".class3") 选择所有具有class3 类的元素; $("div.class3")选择所有具有class3 的元素都是div 元素。更不用说现代浏览器保留了类与元素关系的索引,一个类选择器可以使用getElementsByClassName查询,而另一个需要querySelectorAllgetElementsByClassName+过滤tagNameReference

标签: javascript this


【解决方案1】:

那叫bind()

someFunction = someFunction.bind(foreverThis);

【讨论】:

  • 是的,但是如果在bind() 之后我运行someFunction.apply(evilContext) 它将有不同的this
  • @mishik bind 有效地围绕函数创建一个闭包,并存储提供的上下文以供以后调用该函数时使用;所以应用调用闭包包装器(但是引擎实现它),但不影响闭包如何使用先前存储的上下文调用包装函数。
  • @SLaks,哦,该死的……我怎么会这么瞎……我现在觉得写这样一篇文章来得到一行正确答案有点愚蠢:)
猜你喜欢
  • 2011-06-21
  • 2012-12-31
  • 2020-11-28
  • 1970-01-01
  • 2020-09-18
  • 2013-01-07
  • 2010-12-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多