Calling method with CoRoutine gives NullReferenceException

I have some simple methods for turning on and off gameObjects in my scene. The following work if called directly

public void turnOn(){
  GameObject foo = GameObject.FindWithTag("foo_tag");
  Debug.Log("1 ASSERT YES foo = "+foo);
 foo.SetActive(true); 
}

public void turnOff(){
GameObject foo = GameObject.FindWithTag("foo_tag");
Debug.Log("2 ASSERT YES foo = "+foo);
foo.SetActive(false); 
}

And for testing purposes I want make my gameObjects active again after a certain interval so I’ve created a coroutine like so.
But when using this coroutine the foo reference in both turnOff and turnOn is Null, why?

 void Start () {

turnOff();
 StartCoroutine(ExecuteAfterTime(2));
}

IEnumerator ExecuteAfterTime(float time)
 {
   yield return new WaitForSeconds(time);

     // Code to execute after the delay
 turnOn();
 }

Because once you turn it off you can’t find it with FindWithTag(). (Disabled object won’t receive messages) you need yo reference it in Start() || Awake()

using UnityEngine;
using System.Collections;

public class test : MonoBehaviour 
{
	GameObject foo;

	public void turnOn(){
		Debug.Log("1 ASSERT YES foo = "+foo);
		foo.SetActive(true); 
	}
	
	public void turnOff(){
		Debug.Log("2 ASSERT YES foo = "+foo);
		foo.SetActive(false); 
	}
	void Start () {
		foo = GameObject.FindWithTag("foo_tag");
		turnOff();
		StartCoroutine(ExecuteAfterTime(2));
	}

	IEnumerator ExecuteAfterTime(float time)
	{
		yield return new WaitForSeconds(time);
		
		// Code to execute after the delay
		turnOn();
	}
}

Thanks. !!!