JavaScript 这样写,不知道为什么,总觉有点别扭

2019-06-26 13:34:41 +08:00
 pinews
if (xxx) {
ele.onclick = funA;
} else {
ele.onclick = funB;
}

总感觉哪里有问题。
4613 次点击
所在节点    程序员
33 条回复
yxcoder
2019-06-26 13:45:23 +08:00
xxx?funA:funB
jowan
2019-06-26 13:47:23 +08:00
ele.onclick = () => {
fn(xxx);
}
sutang
2019-06-26 13:54:17 +08:00
ele.onclick = xxx ? funA : funB
azh7138m
2019-06-26 14:00:29 +08:00
没有缩进肯定别扭。
Mitt
2019-06-26 14:01:15 +08:00
能用语法糖解决的问题都不是问题,"编译器"可以帮你优化掉的
zjsxwc
2019-06-26 14:10:48 +08:00
function Condition1(){/*do sth when condition1*/}
function Condition2(){/*do sth when condition2*/}

xxx = "Condition1";
ele.onclick = window[xxx];
uxstone
2019-06-26 14:33:37 +08:00
动态类型嘛 习惯就好
tinycold
2019-06-26 14:35:43 +08:00
你的直觉是对的,对一个 DOM 元素动态地绑定 /移除事件监听是很蠢的事情,编译器到底能不能优化到那一步我不知道,不过你的同事肯定是还没优化到那个地步。

如果你实在是有这么两个函数要重用,这个代码会写成:
```
el.onclick = clickHandler

// clickHandler
if (xxx) {
funA()
} else {
funB()
}
```
banricho
2019-06-26 14:36:26 +08:00
写的什么鬼……

```JS
const fnA = () => {}
const fnB = () => {}
const handle = () => {
isA ? fnA() : fnB()
}

ele.addEventListener('click', handle)
```
wenzhoou
2019-06-26 14:42:19 +08:00
@tinycold 这两种写法明显不等价。
tinycold
2019-06-26 14:45:17 +08:00
@wenzhoou 我理解的「等价」是运行结果一样,不知道你说的「等价」是哪一层意思。
pinews
2019-06-26 14:45:44 +08:00
@wenzhoou 是的,当 click 发生的时候,xxx 判断的结果可能已经变了
hackfly
2019-06-26 14:45:53 +08:00
函数在 js 属于第一类值,和 c 之类的有点不一样
no1xsyzy
2019-06-26 14:49:36 +08:00
Qt 信号槽,handler 就是可以变的,甚至两个的。
no1xsyzy
2019-06-26 14:52:26 +08:00
@pinews #12 也有可能需要保留那时的判断结果
单独存一个变量不如还是直接传函数。

不过如果这些个 funA funB 还会在其他地方用,我想还是存变量好,方便调试,知道是点击事件触发的。
pinews
2019-06-26 15:09:28 +08:00
@no1xsyzy 感谢,解答了我的疑惑
2kCS5c0b0ITXE5k2
2019-06-26 15:25:13 +08:00
ele.onclick: (() => {
if(xxx) {
funA()
} else {
funB()
}
})
lraining
2019-06-26 15:27:25 +08:00
onclick 本质上是一个函数指针,直接指定函数指针或者在一个函数中指定,两者没有本质上的差别,但是有的时候给 onclick 赋值的时候要去掉之前的赋值,否则有可能 onclick 会指向多个函数
markyun
2019-06-26 16:51:18 +08:00
// handleClick
let handleClick;
if (field === 'a') {
handleClick = () => {
this.a(row);
};
} else if (field === 'b') {
handleClick = () => {
this.b(row);
};
}
learnshare
2019-06-26 17:07:17 +08:00
理论上不建议 onclick,因为只能关联一个函数。应该是

target.addEventListener('click', () => {
xxx ? funA : funB;
});

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/577617

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX