首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >变量在transit.js中不起作用

变量在transit.js中不起作用
EN

Stack Overflow用户
提问于 2016-01-27 11:46:35
回答 3查看 118关注 0票数 6

我使用的是transit.js,我有以下代码行:

代码语言:javascript
复制
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函数如下:

代码语言:javascript
复制
var xy = ['x' , 'y'];

function genXY(no) {
    return xy[no];
}

现在,我对单个元素(在我的devTools中)运行了下面的简单测试:

代码语言:javascript
复制
var axis = x;
$('.gridbox .large').eq(2).transition({ x : "100px" });

上面的代码行工作得很好,即它通过100px转换元素,但是现在如果我用轴替换x,它实际上是一个变量,实际上是x,现在代码如下所示:

代码语言:javascript
复制
var axis = x;
$('.gridbox .large').eq(2).transition({ axis : "100px" });

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

EN

回答 3

Stack Overflow用户

发布于 2016-01-27 12:01:58

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

代码语言:javascript
复制
var axis = x;
$('.gridbox .large').eq(2)
             .transition({ axis : "100px" }); // <----see the object { axis : "100px" }

如果您尝试将var名称替换为对象文本中的键,则不引用它的值,但它在对象中设置了一个新的key:value。在ES5和更早版本中,不能将变量用作对象文本中的属性名。

那么,我们能做的是:

代码语言:javascript
复制
var obj   = {}, // a new object creation
    axis  = x;  // a reference to the x

obj[axis] = '100px'; // now it results in {x:"100px"}

$('.gridbox .large').eq(2)
             .transition(obj); // <---put the object here
票数 2
EN

Stack Overflow用户

发布于 2016-02-04 22:17:36

这两行表示相同的内容(引号是可选的):

代码语言:javascript
复制
var obj = { x: '100px' };
var obj = { 'x': '100px' };

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

代码语言:javascript
复制
$('.gridbox .large').eq(2).transition({ x : "100px" });

要解决问题,可以定义一个空对象并向其添加一个动态属性名,然后将该对象作为参数传递。

代码语言:javascript
复制
var axis = 'x';
var obj = {};
obj[ axis ] = '100px';
$('.gridbox .large').eq(2).transition(obj);

还要注意,必须使用[]语法来添加变量(动态)属性名,而不是点语法。下面的示例将添加一个名为axis的属性,而不是x

代码语言:javascript
复制
obj.axis = '100px';
票数 2
EN

Stack Overflow用户

发布于 2016-02-07 05:23:34

ECMAScript是JavaScript实现的语言的规范。

如果您查看ECMAScript标准的第5版的"11.1.5对象初始化器“部分,它将定义用于创建对象的对象字面语法。

让我们看看{ axis: "100px" }是如何根据规范计算的:

ObjectLiteral => { PropertyNameAndValueList } => { PropertyName : AssignmentExpression } => { IdentifierName : AssignmentExpression }

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

有人建议您使用以下代码:

代码语言:javascript
复制
var axis = "x";
var obj = {};
obj[ axis ] = "100px";

这使得使用'axis‘的变量值,因为obj[axis] = "100px"obj["x"] = "100px"相同,后者与{ x: "100px" }{ "x": "100px" }相同。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35036503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档