Javascript &引用;这";内部对象

Javascript &引用;这";内部对象,javascript,object,this,Javascript,Object,This,我试图从通过请求传入的宽度(默认值为560)计算成比例的高度(同时排除静态高度元素) 但是,wF.h的计算结果为NaN。如果我将this.w替换为560,它会工作,但在尝试引用wF的w属性时不会工作 var wF = { w : 560, h : (312 - 42) / (560 / this.w) + 42 }; 有什么好处 我拒绝连续使用两个普通变量,因为我试图从JS中获得好的代码 更新: 感谢所有帮助我解释和解决问题的人。我想我得习惯了。我将分阶段设置对象以

我试图从通过请求传入的宽度(默认值为560)计算成比例的高度(同时排除静态高度元素)

但是,
wF.h
的计算结果为
NaN
。如果我将
this.w
替换为560,它会工作,但在尝试引用
wF
w
属性时不会工作

var wF = {
       w : 560,
       h : (312 - 42) / (560 / this.w) + 42
};
有什么好处

我拒绝连续使用两个普通变量,因为我试图从JS中获得好的代码

更新:


感谢所有帮助我解释和解决问题的人。我想我得习惯了。我将分阶段设置对象以继续项目,尽管它仍然会让我有点恼火;)。我发现并阅读了一篇关于这个主题的文章,这篇文章非常适合那些偶然发现类似问题的人:

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

您需要分两步执行此操作,如下所示:

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

this
关键字引用调用上下文,而不是对象

您需要分两步执行此操作,如下所示:

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

您不需要将{…}包装在对象()中。它已经是一个对象文本

不在对象文本内操作,它将指向函数当前运行的对象,因此:

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

fn();
将导致
指向
窗口
对象

编辑:前面的代码不是用来回答问题的,只是演示一下这是什么。另一种可能性是使用以宽度为参数的函数:

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.

您不需要将{…}包装在对象()中。它已经是一个对象文本

不在对象文本内操作,它将指向函数当前运行的对象,因此:

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

fn();
将导致
指向
窗口
对象

编辑:前面的代码不是用来回答问题的,只是演示一下这是什么。另一种可能性是使用以宽度为参数的函数:

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.

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

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

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

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

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

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

这不是你想象的那样
Javascript没有块作用域,只有函数作用域:
wF
的定义中不指
wF

var wF = {
       w : 560,
       h : (312 - 42) / (560 / this.w) + 42
};
(因此
this.w
,无论
this
是什么,都很可能是
未定义的
。除以
未定义的
得到
NaN

那么你可以试试:

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

您尚未完成对象的定义 但是,您仍然在定义试图使用
wF.w
的对象:


解决方案 所以,是的,你必须使用两个变量。。。或分阶段设置对象:

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

这不是你想象的那样
Javascript没有块作用域,只有函数作用域:
wF
的定义中不指
wF

var wF = {
       w : 560,
       h : (312 - 42) / (560 / this.w) + 42
};
(因此
this.w
,无论
this
是什么,都很可能是
未定义的
。除以
未定义的
得到
NaN

那么你可以试试:

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

您尚未完成对象的定义 但是,您仍然在定义试图使用
wF.w
的对象:


解决方案 所以,是的,你必须使用两个变量。。。或分阶段设置对象:

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

嗨,只要将第二个属性重新定义为函数对象,它就可以工作了。我认为可以从函数中访问调用对象的上下文

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

alert(wF.h())

嗨,只要将第二个属性重新定义为函数对象,它就可以工作了。我认为可以从函数中访问调用对象的上下文

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

alert(wF.h())


ecmascript的哪个版本?我不认为这是javascriptvar wF={--}做了同样的事情。我很高兴你注意到了。作为对象的任何初始化都需要
新建
(您的构造函数)。所以你的对象声明是错误的,虽然你在技术上是正确的,但它与我的问题并没有真正的联系?我不认为这是javascriptvar wF={--}做了同样的事情。我很高兴你注意到了。作为对象的任何初始化都需要
新建
(您的构造函数)。所以你的对象声明是错误的,虽然你在技术上是正确的,但它与我的问题无关。我认为你说的代码不错:)@AlienWebguy是对的,因为它试图除以
this.w
,也就是
window.w
,这是对问题的一个很好的部分解释,但是这里没有解决办法。这个答案没有帮助-请在发布代码之前测试一下。@TeslaNick:显然,这不是答案。这说明了为什么
这个
在对象文本中是错误的。@Nick Tomalak是正确的。我添加了一些有效的代码。@AlienWebguy是的,因为它试图除以
this.w
,这是
window.w
,它是未定义的。这是对问题的一个很好的部分解释,但这里没有解决方案。这个答案没有帮助-请在发布之前测试你的代码。@TeslaNick:这不是一个答案,显然地这说明了为什么
这个
在对象文本中是错误的。@Nick Tomalak是正确的。我添加了一些有效的代码。此代码证明
窗口
,因为,不,它根本不“指向当前实例”。因为您在窗口上下文上运行它。我的意思是,当他使用这个.w时,这并不指向wf。这也不是JSON。这段代码证明了
this
window