For the benefit of the discussion. Let's say that your first function is a normal function and your second function is an arrow function
First of all, let's understand that for each normal function execution in JS, the JS engine creates it's own execution context. A new "this" is then created for each these execution context and thus belong to that function.
Now as it relates to your case, the this keyword on your first function
renderRow(employee) {
console.log('props here', this.props); //undefined
}
refers itself (or to the function where it's currently being called), because the JS engine has created a new this object that refers to it. Thus when your program runs, this.props will have the value of undefined because it wasn't defined on the current execution context (which again, is your renderRow function)
On the other hand... the JS engine doesn't create a new this for arrow functions. To put it simply, an arrow function doesn't have it's own this and thus on your second example,
renderRow = (employee) => {
console.log('props here', this.props); //success!!!
}
this refers to the outer execution context (which is your React Component) and so now this.props work.
For more information about the topics, you can check on these resources...
THIS - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this
ARROW FUNCTIONS - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions
Hope this helps :)