2016-09-23 8 views
0

Я бы ожидать «иксы» результаты, результаты «у» и результаты «Заболоцкого» быть тем же самым:цикл присваивает же functon каждый раз в LiveScript

В 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 
+3

Вы назначаете '' $ Fn для всех свойств 'y' так почему' 'y.a' и y.b' быть разными? Что вы ожидаете от них? – JJJ

+1

, если вы проверите консоль, вы увидите, что 'y' - это объект с' a: function fn $() 'и' b: function fn $() ', поэтому сравнение возвращает true. – Craicerjack

+1

Я заметил оптимизацию 'fn $' сразу после публикации вопроса. Спасибо... – ceremcem

ответ

1

Я не верю в общепринятом собственного ответа. Ссылка v все еще меняется.

То, что вы хотите вместо этого for let:

y = {} 
for let k, v of x 
    console.log "key: ", k, "val: ", v 
    y[k] = -> v.call this 
0

Корень проблемы была fn$ оптимизация LiveScript в. Следующий код работает хорошо:

LiveScript:

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);