为什么不能用JavaScript中的函数变量覆盖字符串变量?

时间:2013-10-23 13:33:05

标签: javascript underscore.js

我试图用函数覆盖给定的javascript变量,以防它是一个字符串:

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

但是,令人惊讶的是, mapper 仍然是给定的字符串,而不是函数!

现在,当我将上述语句中的相同rvalue分配给新的varialbe时,它的行为符合预期:

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

(我之后在代码中使用 mapFunction ,而不是 mapper

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

2 个答案:

答案 0 :(得分:1)

问题是mapper函数内部不会记住原始值,它将是调用它时的新值。

所以你所拥有的是对用作索引的函数的引用。

您需要持有副本并在函数内部使用它。

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

答案 1 :(得分:0)

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

var s = 's';

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

s; //function...

你刚才假设mapper是一个字符串或者_.isString是错误的,我怀疑这个错误。

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