“use strict”

时间:2017-12-12 00:51:37

标签: javascript d3.js strict


    "use strict";

对我的D3JS强制网络图有效,我无法使用this.getBBox();使用代码在强制网络图中旋转边标签文本:

edgelabels.attr('transform',function(d,i){
  if (d.target.x<d.source.x){
    bbox = this.getBBox();
    rx = bbox.x+bbox.width/2;
    ry = bbox.y+bbox.height/2;
    return 'rotate(180 '+rx+' '+ry+')';
  }
  else { return 'rotate(0)'; }
});

如果我禁用"use strict;"我的代码运行没有错误,标签正确旋转。小提琴: https://jsfiddle.net/NovasTaylor/cnaqaxnh/

我将原始代码基于此块: http://bl.ocks.org/jhb/5955887

我的代码如何通过getBBox()或getBBox()的替代方法使用"use strict;"来修复运行?

1 个答案:

答案 0 :(得分:4)

此处的问题不是getBBox(),而是缺少var:在非严格模式下,对未声明变量的赋值将该变量视为全局变量。但是,这不会在严格的模式下工作。

如果你看一下关于严格模式的MDN page

  

首先,严格模式使得无法意外创建全局变量。在正常的JavaScript错误输入中,赋值中的变量会在全局对象上创建一个新属性,并继续&#34; work&#34; (虽然未来的失败是可能的:可能,在现代JavaScript中)。意外创建全局变量的赋值将以严格模式抛出。 (强调我的)

所以,而不是:

edgelabels.attr('transform', function(d, i) {
    if (d.target.x < d.source.x) {
        bbox = this.getBBox();
        rx = bbox.x + bbox.width / 2;
        ry = bbox.y + bbox.height / 2;
        return 'rotate(180 ' + rx + ' ' + ry + ')';
    } else {
        return 'rotate(0)';
    }
});

应该是:

edgelabels.attr('transform', function(d, i) {
    if (d.target.x < d.source.x) {
        var bbox = this.getBBox();
        var rx = bbox.x + bbox.width / 2;
        var ry = bbox.y + bbox.height / 2;
        return 'rotate(180 ' + rx + ' ' + ry + ')';
    } else {
        return 'rotate(0)';
    }
});

这是更新的小提琴:https://jsfiddle.net/onnoqyp4/