“这个”里面的对象

时间:2011-08-12 16:48:22

标签: javascript object this

我正在尝试从通过请求传递的宽度(默认为560)计算比例高度(同时排除静态高度元素)。

但是,wF.h评估为NaN。如果我将this.w替换为560,则会有效,但在尝试引用w的{​​{1}}属性时却无效。

wF

是什么给出了?

我拒绝连续使用两个普通的变量,因为我正试图从JS中获取漂亮的代码。

更新

感谢所有帮助解释和解决问题的人。我想我只需要习惯它。我将分阶段设置对象以继续项目,即使它仍然让我稍微烦恼;)。对于遇到类似问题的人,我找到并阅读了一篇关于这个主题的好文章:http://yehudakatz.com/2011/08/11/understanding-javascript-function-invocation-and-this/

5 个答案:

答案 0 :(得分:61)

// Your code
var wF = {
       w : 560,
       h : (312 - 42) / (560 / this.w) + 42
};

this不是您认为的

Javascript没有块范围,只有函数范围:this定义中的wF 引用wF

(所以this.w,无论this是什么,都可能是undefined。除以undefined会产生NaN。)

那么你可以试试:

// Let's not use `this`
var wF = {
       w : 560,
       h : (312 - 42) / (560 / wF.w) + 42
};

您还没有完成对象的定义

但是,您仍在定义对象,您尝试使用wF.wit's not ready for that yet


解决方案

所以,是的,你必须使用两个变量......或者分阶段设置对象:

// We can't even use `wF`; split up the property definitions
var wF = {};
wF.w = 560;
wF.h = (312 - 42) / (560 / wF.w) + 42;

答案 1 :(得分:22)

您只需将第二个属性重新定义为函数对象即可。我认为可以从函数

中访问调用对象的上下文
var wF = {
    w : 560,
    h : function() { return (312 - 42) / (560 / this.w) + 42; }
};

alert(wF.h())

答案 2 :(得分:3)

this关键字指的是调用上下文,而不是对象。

您需要分两步完成此操作:

var wF = { w: 560 };
wF.h = (312 - 42) / (560 / wF.w) + 42;

答案 3 :(得分:1)

您不需要将{...}包装在Object()中。它已经是一个对象字面。

this不在对象文字内部运行,它将指向该函数当前正在运行的对象:

function fn() {
   var wF = { w : 560, h : (312 - 42) / (560 / this.w) + 42 };
}

fn();

会导致this指向window对象。

编辑:以前的代码并不是一个答案,只是对this是什么的演示。另一种可能性是使用一个以宽度为参数的函数:

function getObject(width) {
    width = width || 560; //Default value to 560
    return { w: width, h : (312 - 42) / (560 / width) + 42 };
}

var wF = getObject(); //To get the default value, or specify a width otherwise.

答案 4 :(得分:-1)

在JSON对象声明中使用它时,它指向当前实例。

您可以在控制台中尝试使用此代码,以便更好地理解它:

Object({ w : 560, h : (312 - 42) / (560 / function(e){console.log(e);return e.w;}(this)) + 42 });