【问题标题】:This and closures in javascript (working in paper.js)这个和javascript中的闭包(在paper.js中工作)
【发布时间】:2015-01-19 02:02:08
【问题描述】:

我还在纠结于闭包。

我正在使用Paper.jspaperscript 开展一个项目。我正在尝试创建具有距离度量的线段,该距离度量在移动时保持在线段的中心。

不是简单地编写代码来分别移动中心和线(这将非常简单),我一直在研究是否可以移动线并让中心跟随。

事实证明这很困难。它可能有几个问题,但现在this 是我目前的bugaboo。我现在设置它们的方式,this 指的是调用函数时的全局对象,这当然不是我想要的。但我不知道如何创建我想要的,这当然是从“重量”元素到“线”元素的烘焙参考。

我该如何正确地做到这一点?

edge = new Group({
    children: [
        new Path.Line({
            from: gn.position,
            to: event.point,
            strokeColor: 'maroon',
            name: 'line'
        }),
        new PointText(function (){
            return {
                position: function () {
                    return this.previousSibling.position;
                }(),
                content: function () {
                    return this.previousSibling.length.toString();
                }(),
                name: 'weight'
            }
        }())
    ]
});

【问题讨论】:

  • this 的值与闭包无关,它总是在当前执行上下文中解析,由你调用函数的方式设置,或者 bind.
  • 你能解释更多吗?我正在尝试创建一个this 以某种方式永久编码到对象中的函数的情况,我认为闭包可能有助于做到这一点。我最好的策略是什么?
  • "this指的是函数调用时的全局作用域" 哪个函数?而且我认为你的意思是全局对象,你不能以任何方式引用范围。
  • 您可以在要在该函数和this 上下文之间创建确定关系的每个函数中调用bind(),但我想您最好更改编写代码的方式。
  • @RobG - 函数应该返回 PointText 对象的新位置和内容。 this 并不意味着 PointText 对象...我希望它引用它自己的前一个兄弟。

标签: javascript closures this paperjs


【解决方案1】:

为了给出更好的结构,并绑定一个this引用,你可以开始定义一个构造函数:

function PointTextContent(name) {
  this.position = function () {
    return this.previousSibling.position;
  }.bind(this);
  this.content = function () {
    return this.previousSibling.length.toString();
  }.bind(this);
  this.name = name;

  PointText.call(this, this);
}

PointTextContent.prototype = PointText;

然后更改您的代码以实例化您的新对象。

edge = new Group({
    children: [
        new Path.Line({
            from: gn.position,
            to: event.point,
            strokeColor: 'maroon',
            name: 'line'
        }),
        new PointTextContent('weight')
    ]
});

注意:我将 positioncontent 更改为函数,我看到它们立即在您的原始代码中被调用。

【讨论】:

  • 我认为这很接近,但 position 中的 this 将引用 PointTextContent 实例,而我认为 OP希望它引用 PointText 实例。我看不出如何在调用中完成,因为 this 需要引用一个尚不存在的对象。但我可能错了……
  • @RobG 你是对的。我在编写这段代码时改变了主意。也许是 PointText 的子类...
  • 好的,所以我把它放到了我的脚本中,我在 PointText.call(this, this) 上收到了我个人最喜欢的 Javascript 错误 undefined is not a function。或许值得一提的是PointText 是一个paperjs 对象。真的无法想象为什么这很重要......但似乎我们不能称之为?
  • 虽然我不确定……完整的堆栈跟踪进入了 PointText 继承自的 TextItem 类(我可以在 Javascript 中说“类”吗?)。我也不完全理解 PointText.call(this,this) 应该在这里做什么。这不会创建一个 PointText 对象 within PointTextContent 吗?
  • 我相信错误在 PointText() 内部。尝试进入。
猜你喜欢
  • 2011-03-02
  • 2015-10-11
  • 1970-01-01
  • 1970-01-01
  • 2020-08-18
  • 2021-11-30
  • 2016-12-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多