for循环每次在Livescript中分配相同的功能
for loop assigns same functon everytime in Livescript
我希望 "x's" 结果,"y's" 结果和 "z's" 结果相同:
在 LiveScript 中:
x =
a: -> 3
b: -> 4
y = {}
for k, v of x
console.log "key: ", k, "val: ", v
y[k] = -> v.call this
console.log "y is: ", y
console.log "x's: ", x.a is x.b # should return false, returns false
console.log "y's: ", y.a is y.b # should return false, returns true
z = {}
z['a'] = ->
x.a.call this
z['b'] = ->
x.b.call this
console.log "z's: ", z.a is z.b # should return false, returns false
在Javascript中:
var x, y, k, v, z;
x = {
a: function(){
return 3;
},
b: function(){
return 4;
}
};
y = {};
for (k in x) {
v = x[k];
console.log("key: ", k, "val: ", v);
y[k] = fn$;
}
console.log("y is: ", y);
console.log("x's: ", x.a === x.b);
console.log("y's: ", y.a === y.b);
z = {};
z['a'] = function(){
return x.a.call(this);
};
z['b'] = function(){
return x.b.call(this);
};
console.log("z's: ", z.a === z.b);
function fn$(){
return v.call(this);
}
打印:
x's: false # should be false, OK
y's: true # should be false, PROBLEM!
z's: false # should be false, OK
问题的根源在于 Livescript 的 fn$
优化。以下代码运行良好:
实时脚本:
x =
a: -> 3
b: -> 4
y = {}
for k, v of x
console.log "key: ", k, "val: ", v
y[k] = ``function (){return v.call(this)}``
console.log "y is: ", y
console.log "x's: ", x.a is x.b # should return false, returns false
console.log "y's: ", y.a is y.b # should return false, returns true
z = {}
z['a'] = ->
x.a.call this
z['b'] = ->
x.b.call this
console.log "z's: ", z.a is z.b # should return false, returns false
Javascript:
var x, y, k, v, z;
x = {
a: function(){
return 3;
},
b: function(){
return 4;
}
};
y = {};
for (k in x) {
v = x[k];
console.log("key: ", k, "val: ", v);
y[k] = function (){return v.call this};
}
console.log("y is: ", y);
console.log("x's: ", x.a === x.b);
console.log("y's: ", y.a === y.b);
z = {};
z['a'] = function(){
return x.a.call(this);
};
z['b'] = function(){
return x.b.call(this);
};
console.log("z's: ", z.a === z.b);
我不相信公认的自我回答。 v
引用仍在更改。
你想要的是 for let
:
y = {}
for let k, v of x
console.log "key: ", k, "val: ", v
y[k] = -> v.call this
我希望 "x's" 结果,"y's" 结果和 "z's" 结果相同:
在 LiveScript 中:
x =
a: -> 3
b: -> 4
y = {}
for k, v of x
console.log "key: ", k, "val: ", v
y[k] = -> v.call this
console.log "y is: ", y
console.log "x's: ", x.a is x.b # should return false, returns false
console.log "y's: ", y.a is y.b # should return false, returns true
z = {}
z['a'] = ->
x.a.call this
z['b'] = ->
x.b.call this
console.log "z's: ", z.a is z.b # should return false, returns false
在Javascript中:
var x, y, k, v, z;
x = {
a: function(){
return 3;
},
b: function(){
return 4;
}
};
y = {};
for (k in x) {
v = x[k];
console.log("key: ", k, "val: ", v);
y[k] = fn$;
}
console.log("y is: ", y);
console.log("x's: ", x.a === x.b);
console.log("y's: ", y.a === y.b);
z = {};
z['a'] = function(){
return x.a.call(this);
};
z['b'] = function(){
return x.b.call(this);
};
console.log("z's: ", z.a === z.b);
function fn$(){
return v.call(this);
}
打印:
x's: false # should be false, OK
y's: true # should be false, PROBLEM!
z's: false # should be false, OK
问题的根源在于 Livescript 的 fn$
优化。以下代码运行良好:
实时脚本:
x =
a: -> 3
b: -> 4
y = {}
for k, v of x
console.log "key: ", k, "val: ", v
y[k] = ``function (){return v.call(this)}``
console.log "y is: ", y
console.log "x's: ", x.a is x.b # should return false, returns false
console.log "y's: ", y.a is y.b # should return false, returns true
z = {}
z['a'] = ->
x.a.call this
z['b'] = ->
x.b.call this
console.log "z's: ", z.a is z.b # should return false, returns false
Javascript:
var x, y, k, v, z;
x = {
a: function(){
return 3;
},
b: function(){
return 4;
}
};
y = {};
for (k in x) {
v = x[k];
console.log("key: ", k, "val: ", v);
y[k] = function (){return v.call this};
}
console.log("y is: ", y);
console.log("x's: ", x.a === x.b);
console.log("y's: ", y.a === y.b);
z = {};
z['a'] = function(){
return x.a.call(this);
};
z['b'] = function(){
return x.b.call(this);
};
console.log("z's: ", z.a === z.b);
我不相信公认的自我回答。 v
引用仍在更改。
你想要的是 for let
:
y = {}
for let k, v of x
console.log "key: ", k, "val: ", v
y[k] = -> v.call this