Javascript x不';t在运输途中工作。js

Javascript x不';t在运输途中工作。js,javascript,jquery,jquery-plugins,Javascript,Jquery,Jquery Plugins,我正在使用,我有以下代码行: var axis = Math.floor(Math.random() * 2); axis = genXY(axis); if($(this).hasClass(btn_className)) { $(this).transition({ axis : '100px' } , function(){ $(this).addClass('active'); $(this).transition({ axis :

我正在使用,我有以下代码行:

var axis = Math.floor(Math.random() * 2);
axis = genXY(axis);

if($(this).hasClass(btn_className)) {       
    $(this).transition({ axis : '100px' } , function(){
        $(this).addClass('active');
        $(this).transition({ axis :  0 , duration : 2000 });
    })  

} 
genXY函数如下所示:

var xy = ['x' , 'y'];

function genXY(no) {
    return xy[no];
}
现在,我在单个元素上运行了以下简单测试(在我的devTools中):

上述代码行工作正常,即它通过
100px
,但是现在如果我用axis替换x,它实际上是一个变量,实际上是x,现在代码如下所示:

var axis = x;
$('.gridbox .large').eq(2).transition({ axis : "100px" });

上面这行不行。为什么它现在起作用了?毕竟轴本身就是x,有人能解释吗

实际上,您正在为一个对象放置一个键,而这样做是不可能的:

var axis = x;
$('.gridbox .large').eq(2)
             .transition({ axis : "100px" }); // <----see the object { axis : "100px" }

这两行的意思相同(引号是可选的):

因此,在下面的一行中,您并没有真正使用变量,而是定义了一个属性名
x

$('.gridbox .large').eq(2).transition({ x : "100px" });
obj.axis = '100px';
要解决这个问题,可以定义一个空对象并向其添加动态属性名,然后将该对象作为参数传递

var axis = 'x';
var obj = {};
obj[ axis ] = '100px';
$('.gridbox .large').eq(2).transition(obj);
还要注意,必须使用
[]
语法来添加变量(动态)属性名,而不是点语法。以下示例将添加名为
axis
的属性,而不是
x

$('.gridbox .large').eq(2).transition({ x : "100px" });
obj.axis = '100px';

ECMAScript是JavaScript实现的语言的规范

如果查看的“11.1.5对象初始化器”部分,它定义了用于创建对象的对象文字语法

让我们看看如何根据规范评估
{axis:“100px”}

ObjectLiteral=>{PropertyName和ValueList}=>{PropertyName:AssignmentExpression} =>{IdentifierName:AssignmentExpression}

对于IdentifierName,它声明:“返回包含与IdentifierName相同字符序列的字符串值”。换句话说,
{axis:“100px”}
{axis:“100px”}
相同,这与
{x:“100px”}
{x:“100px”}
不同。换句话说,对象文字中未加引号的属性名将成为名称的字符串版本,而不是变量值。这就是为什么不能用
{axis:“100px”}
替换
{axis:“100px”}
,因为它们不相同

建议您使用以下代码:

var axis = "x";
var obj = {};
obj[ axis ] = "100px";

这是为了使用“axis”的变量值,因为
obj[axis]=“100px”
obj[“x”]=“100px”
相同,这与
{x:“100px”}
{x:“100px”}

非常感谢您的解释,但我还是不明白,你能把它分解一下吗?我的意思是这一部分
如果您尝试在对象文本中放置一个var名称来代替key,它并不引用它的值,而是在对象中设置一个新的key:value。在ES5及更早版本中,不能在对象文本中使用变量作为属性名。
@Jai
axis=x应该是
axis='x'
@DaveF您是对的,但这可能是另一个变量,它引用了其他一些值,但肯定必须是
“x”
var axis=x计算结果为
var axis=undefined
。我相信您的意思是键入
var axis=“x”。这与为什么不能使用
{axis:“100px”}
替换
{x:“100px”}
无关,但我想提及它以帮助以后进行调试。
var axis = "x";
var obj = {};
obj[ axis ] = "100px";