2013-10-23 95 views
0

我试图覆盖一个给定的JavaScript与函数变量,如果它是一个字符串:为什么不能在JavaScript中用函数变量覆盖字符串变量?

mapper = _.isString(mapper) ? function (item) { return item[mapper]; } : mapper; 

不过,出人意料的是,映射仍然是给定的字符串,而不是功能!

现在,当我分配了相同的右值从上面的语句,到一个新的varialbe,它表现为预期:

var mapFunction = _.isString(mapper) ? function (item) { return item[mapper]; } : mapper; 

(我用的是mapFunction在后面的代码,而不是映射

我错过了什么?我不能将一个函数分配给一个曾经是字符串的变量吗?

+0

无法用'var mapper ='e';'重现此操作,然后运行您的代码。 –

+1

对那个函数里的'mapper'的引用不会做你认为它会做的事。 – epascarello

+0

猜测epascarello是正确的,因为它是一个范围问题,它实际上不会以这种方式重现。谢谢! – Jacob

回答

1

问题是mapper里面的函数不会记住原来的值,它会在调用的时候是新的值。

所以你有一个引用被用作索引的函数。

你需要保留一个副本并在函数内部使用它。

var _orgMapper = mapper; 
mapper = _.isString(mapper) ? function (item) { return item[_orgMapper]; } : mapper; 
+0

这是真的,但似乎并没有涉及到OP的问题,也没有解释在作业之后'mapper'仍然可以是一个字符串。变量封装在闭包中的事实对分配没有影响。 – plalx

0

这是不可能的。三元运营商不犯错误;)

var s = 's'; 

s = typeof s === 'string'? function() {} : s; 

s; //function... 

你刚才提出的无效假设mapper是一个字符串或_.isString是越野车,我怀疑。

注意:请参阅@epascarello回答您遇到的与闭包有关的另一个问题。

相关问题