Javascript ES6 模板字符串函数名称 - Chrome 好的,Firefox KO - 似乎是一个转译问题
Javascript ES6 template strings function names - Chrome OK, Firefox KO - Seems like a transpilation issue
如何跨浏览器调用动态函数名?
我已经看到了一些方法,但是 none as "elegant" 如下所示。
问题是它在 Chrome 中工作,但在 Firefox 和 Safari 中不工作。
如果我打电话给
const component = "a";
this[component]() // console: Called a
this[`${component}`]() // console: Called a
在Chrome上它工作正常,函数被正确调用。
在 Firefox 上显示
TypeError: this[("" + component)] is not a function
如果我想实现这个应该怎么做?
编辑 以添加更多上下文
框架是 React。
示例:
export default class MyComp extends Component {
a() {
console.log("Called a");
}
b() {
console.log("Called b");
}
c() {
console.log("Called c");
}
renderAThing(component) {
return this[component]();
}
render() {
return this.renderAThing("a");
}
}
如果我在 render() 中直接调用 thiscomponent 就可以了。
EDIT 2 看来这是一个转译问题而不是浏览器问题。正如您所指出的,该代码对 Chrome 和 Firefox 有效。
我将 React 与 Meteor 和 Babel 一起使用。
感谢@Jaromanda X 的提示。
仅供参考,缩小的(=生产)Meteor 代码也不适用于 Chrome。
此代码适用于 Firefox 58:
function a() {
console.log("Called a");
}
function b() {
console.log("Called b");
}
function c() {
console.log("Called c");
}
const component = "a";
this[component]() // console: Called a
this[`${component}`]() // console: Called a
但我想您的问题是 this
关键字。您可以将其替换为 window
以避免它。但这完全取决于您的代码在哪里。
Shorthand 方法定义可以用在对象字面量和 ES6 的方法声明中 类.
例如:
class myClass {
a() {
console.log("Called a");
}
b() {
console.log("Called b");
}
c() {
console.log("Called c");
}
}
或对象内:
var myObject = {
a() {...},
b() {...}
.
.
}
在您的情况下,您需要将函数创建为 Declaration or Expression:
function a() {
console.log("Called a");
}
function b() {
console.log("Called b");
}
function c() {
console.log("Called c");
}
const component = "a";
this[component]() // console: Called a
this[`${component}`]() // console: Called a
因为这不是浏览器问题而是转译问题,所以我最终以完全不同的方式处理它。它是这样的:
export default class DateTimePicker extends Component {
getComponentValue(component) {
const { value } = this.props; // React properties
if (!value) return null;
if (component === "a") return value.getA();
if (component === "b") return value.getB();
return null;
}
renderA(component) {
const componentValue = this.getComponentValue(component);
return (
<div>{componentValue}</div>
);
}
render() {
return (
<div>
{this.renderA("a")}
</div>
);
}
}
我不是很满意,但我想现在还可以。
如何跨浏览器调用动态函数名? 我已经看到了一些方法,但是 none as "elegant" 如下所示。 问题是它在 Chrome 中工作,但在 Firefox 和 Safari 中不工作。
如果我打电话给
const component = "a";
this[component]() // console: Called a
this[`${component}`]() // console: Called a
在Chrome上它工作正常,函数被正确调用。 在 Firefox 上显示
TypeError: this[("" + component)] is not a function
如果我想实现这个应该怎么做?
编辑 以添加更多上下文
框架是 React。
示例:
export default class MyComp extends Component {
a() {
console.log("Called a");
}
b() {
console.log("Called b");
}
c() {
console.log("Called c");
}
renderAThing(component) {
return this[component]();
}
render() {
return this.renderAThing("a");
}
}
如果我在 render() 中直接调用 thiscomponent 就可以了。
EDIT 2 看来这是一个转译问题而不是浏览器问题。正如您所指出的,该代码对 Chrome 和 Firefox 有效。 我将 React 与 Meteor 和 Babel 一起使用。 感谢@Jaromanda X 的提示。
仅供参考,缩小的(=生产)Meteor 代码也不适用于 Chrome。
此代码适用于 Firefox 58:
function a() {
console.log("Called a");
}
function b() {
console.log("Called b");
}
function c() {
console.log("Called c");
}
const component = "a";
this[component]() // console: Called a
this[`${component}`]() // console: Called a
但我想您的问题是 this
关键字。您可以将其替换为 window
以避免它。但这完全取决于您的代码在哪里。
Shorthand 方法定义可以用在对象字面量和 ES6 的方法声明中 类.
例如:
class myClass {
a() {
console.log("Called a");
}
b() {
console.log("Called b");
}
c() {
console.log("Called c");
}
}
或对象内:
var myObject = {
a() {...},
b() {...}
.
.
}
在您的情况下,您需要将函数创建为 Declaration or Expression:
function a() {
console.log("Called a");
}
function b() {
console.log("Called b");
}
function c() {
console.log("Called c");
}
const component = "a";
this[component]() // console: Called a
this[`${component}`]() // console: Called a
因为这不是浏览器问题而是转译问题,所以我最终以完全不同的方式处理它。它是这样的:
export default class DateTimePicker extends Component {
getComponentValue(component) {
const { value } = this.props; // React properties
if (!value) return null;
if (component === "a") return value.getA();
if (component === "b") return value.getB();
return null;
}
renderA(component) {
const componentValue = this.getComponentValue(component);
return (
<div>{componentValue}</div>
);
}
render() {
return (
<div>
{this.renderA("a")}
</div>
);
}
}
我不是很满意,但我想现在还可以。