JSfiddle“x”未定义“这段代码有什么问题?

时间:2014-02-22 08:54:57

标签: javascript

points = function() {
var p1 = this[0];
var p2 = this[1];
var a=p2.x-p1.x;
var b=p2.y-p1.y;
return Math.sqrt(a*a + b*b); 
}; 
points();

我正在使用“JavaScript权威指南”第1章。每当我将此代码放在JSfiddle上时,它就不会运行并说:

  

“未捕获的TypeError:无法读取未定义的属性'x'。”

所以x没有被定义......当它们运行时书中会有什么,它显示=> 1.414 //两点之间的距离。

实际上,上述书中没有任何代码具有无错运行的有效代码。

如何调整代码以使其运行?

编辑:感谢大家回答我的问题。我从教科书中逐字逐句地复制。他们也没有定义变量。无论如何,感谢和更多的问题将来临:P。

3 个答案:

答案 0 :(得分:0)

嗯,你调用函数的方式,上下文(this)将是window,据我所知window[0]window[1]不存在,我不确定你期望什么,但是你的代码中没有一次定义任何Numbers那么你期望在数学运算上做什么?

使其工作的方式是使用arguments这样的对象

p1 = {  
   x: 5, y: 2
};

p2 = {  
   x: 1, y: 8
};

points = function(p1, p2) {
    var a = p2.x - p1.x;
    var b = p2.y - p1.y;

    return Math.sqrt( a * a + b * b); 
}; 

console.log(points(p1,p2));

http://jsfiddle.net/mbrz4/

答案 1 :(得分:0)

好像你想要这样做

var distance = function(p1, p2) {
  return Math.sqrt(
    Math.pow(p2.x - p1.x, 2) + 
    Math.pow(p2.y - p1.y, 2)
  );
};

distance(
  {x: 1, y: 3},
  {x: 3, y: 9}
)

// 6.324555320336759

另外,在定义变量时不要忘记使用var关键字。

答案 2 :(得分:0)

有了这个定义:

var points = function() {
    var p1 = this[0];
    var p2 = this[1];
    var a=p2.x-p1.x;
    var b=p2.y-p1.y;
    return Math.sqrt(a*a + b*b); 
};

调用它的正确方法是:

points.call([{x: 1, y:2}, {x: 2, y: 3}]);