Function.call方法作为回调

时间:2016-02-09 18:18:36

标签: javascript

对不起,如果我错过了一些东西,但是当我尝试使用call方法作为回调时,它会在Chrome和Node.js中给出奇怪的错误。

['  foo', ' bar  '].map(String.prototype.trim.call);
TypeError: ["  foo", " bar  "].map is not a function
at Array.map (native)

但这些片段有效:

['  foo', ' bar  '].map(function (item) { 
    return String.prototype.trim.call(item);
}); // => ['foo', 'bar']
/*
  and ES2015
*/
['  foo', ' bar  '].map(function () { 
    return String.prototype.trim.call(...arguments);
}); // => ['foo', 'bar']

我还检查了call函数的类型:

typeof String.prototype.trim.call; // => 'function'

我做错了吗?谁能解释一下为什么我会收到这样的错误?感谢。

1 个答案:

答案 0 :(得分:0)

解决问题的最简单方法就是写出来:

<Grid>
  <Grid.ColumnDefinitions>
    ...
    <ColumnDefinition Width="..." x:Name="cbColumn" />
  </Grid.ColumnDefinitions>
  <ComboBox>
    <ComboBox.ItemsPanel>
      <ItemsPanelTemplate>
        <VirtualizingStackPanel />
      </ItemsPanelTemplate>
    </ComboBox.ItemsPanel>
    <ComboBox.ItemTemplate>
      <DataTemplate>
        <TextBlock TextWrapping="Wrap" Width="{Binding ActualWidth, ElementName=cbColumn}" />
      </DataTemplate>
    </ComboBox.ItemTemplate>
  </ComboBox>
</Grid>

如果你想传递一个函数,你将需要一些比你想要的更复杂的东西,按照

的方式
['  foo', ' bar  '].map(s => s.trim());

或者如果您愿意

.map(Function.call.bind(String.prototype.trim))

This question可能会回答您的所有问题。