我正在尝试从通过请求传递的宽度(默认为560)计算比例高度(同时排除静态高度元素)。
但是,wF.h
评估为NaN
。如果我将this.w
替换为560,则会有效,但在尝试引用w
的{{1}}属性时却无效。
wF
是什么给出了?
我拒绝连续使用两个普通的变量,因为我正试图从JS中获取漂亮的代码。
更新
感谢所有帮助解释和解决问题的人。我想我只需要习惯它。我将分阶段设置对象以继续项目,即使它仍然让我稍微烦恼;)。对于遇到类似问题的人,我找到并阅读了一篇关于这个主题的好文章:http://yehudakatz.com/2011/08/11/understanding-javascript-function-invocation-and-this/
答案 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.w
:it'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 });