函数的用法眼花缭乱,即使工做了不少年的人,熟悉各类框架的函数用法,可是未必知道为何要这么用,为何换一种用法就不能够。react
这节思考课,就是从最简单的一个demo开始,逐渐展开思考,一步步尝试来理解它。segmentfault
先上基础代码:框架
var variable function showText(text) { console.log(text); }
基础代码只有一个变量,一个函数。下面依据基础代码进行实验函数
首先,调用函数并赋值给变量:es5
var variable function showText(text) { console.log(text); } variable = showText('基础代码执行') console.log(variable)
直接运行上面的代码,结果以下:spa
说明 showText 方法调用了。3d
结论一:code
稍稍变一下:blog
var variable function showText(text) { console.log(text); } variable = showText variable('变量赋值后调用') console.log(variable)
再看运行结果:事件
结论二:
变量调用没这个说法,姑且这么说是为了理解,就是变量名加一对括号:
variable()
将变量赋值为一个匿名函数(也就是函数表达式)
var variable function showText(text) { console.log(text); } variable = function () { showText('函数调用') } console.log(variable) variable()
运行结果:
结论三:
根据这三个结论,咱们能够发现:
function showText(text) { console.log(text); } // 基本等同于 var showText = function(text) { console.log(text); } // 统一调用方式为: showText('txt');
了解了基础,下面咱们来看项目实践
先来一段基础的 react 代码
import React from 'react' const TestPage = (props) => { const testFun = ()=> { console.log('函数执行') } return ( <div onClick={testFun}></div> ) } export default TestPage;
点击事件等于函数名,函数正常触发。
应该有人试过写成这样:
<div onClick={testFun()}></div>
这样写就不行了,函数一开始就触发了,可是点击时候没反应。
可是写成这样就又正常了:
<div onClick={()=> testFun()}></div>
为何会这样?结合第一节来分析一波。
为何这样写能够:
<div onClick={testFun}></div>
由于这个写法就等于:
div.onClick = testFun
把 div.onClick
看作一个变量,再结合 结论二 能够得知:
div.onClick() == testFun()
因此在 div 执行 onClick()
时就调用了 testFun();
再看这个写法:
<div onClick={testFun()}></div>
和上一步同样的拆解
div.onClick = testFun()
结合 结论一 能够得知,testFun() 会当即执行,可是 div.onClick 等于 undefined 至关于未赋值,因此点击没反应。
<div onClick={()=> testFun()}></div>
拆解后:
div.onClick = ()=> testFun() // 等于 es5 写法: div.onClick = function() { testFun() }
结合 结论三 可知:
匿名函数不会当即执行,onClick() 时触发 testFun(),因此正常运行
改造一波,给 div 加一段显示内容
const getName = ()=> { return '我是一个div' } <div onClick={testFun}>{getName()}</div>
发现了吗,这里又不同了。
标签内 getName()
这么写是对的,光写函数名反而是错的,这与事件里使用函数的方法正好相反。
为什呢?由于标签内的内容就是要当即触发函数来获得的,不须要在指定条件下触发。