2016-09-23 45 views
0
分配相同functon每次

我希望 「X的」 的結果, 「Y的」 成果和 「z的」 結果是一樣的:for循環的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

問題的根源在於Livescript的fn$優化。下面的代碼工作得很好:

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