0

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

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

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

现在,当我将上述语句中的相同右值分配给一个新变量时,它的行为与预期一致:

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

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

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

4

2 回答 2

1

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

因此,您所拥有的是对用作索引的函数的引用。

您需要保留一份副本并在函数内使用它。

var _orgMapper = mapper;
mapper = _.isString(mapper) ? function (item) { return item[_orgMapper]; } : mapper;
于 2013-10-23T13:36:51.450 回答
0

这是不可能的。三元运算符不会犯错误;)

var s = 's';

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

s; //function...

您只是做出了无效的假设,即mapper字符串或_.isString错误,我对此表示怀疑。

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

于 2013-10-23T13:46:29.217 回答