【问题标题】:When to wrap JS variable in quotes何时将 JS 变量用引号括起来
【发布时间】:2018-08-04 17:26:09
【问题描述】:

我有以下 JS 正在工作,但我对为什么需要将变量 func 用引号括起来感到困惑。谁能解释一下?

function CustomPrompt(){
	this.render = function(dialog,func){
	  var winW = window.innerWidth;
	  var winH = window.innerHeight;
	  var dialogoverlay = document.getElementById('dialogoverlay');
	  var dialogbox = document.getElementById('dialogbox');

	  dialogoverlay.style.display = "block";
	  dialogoverlay.style.height = winH+"px";
	  dialogbox.style.left = (winW/2) - (550 * .5)+"px";
	  dialogbox.style.top = "100px";
	  dialogbox.style.display = "block";

	  document.getElementById('dialogboxhead').innerHTML = '&nbsp';
	  document.getElementById('dialogboxbody').innerHTML = dialog;
	  document.getElementById('dialogboxbody').innerHTML += '<br><input id="prompt_value1"  >';
		
	  document.getElementById('prompt_value1').focus();

//HERE'S THE LINE I'M CONFUSED BY
//*******************************
	  document.getElementById('dialogboxfoot').innerHTML = '<button onclick="Prompt.ok(\''+func+'\')">OK</button> <button onclick="Prompt.cancel()">Cancel</button>';
    
	}

	this.cancel = function(){
	  document.getElementById('dialogbox').style.display = "none";
	  document.getElementById('dialogoverlay').style.display = "none";
	}
	this.ok = function(func){
	  var prompt_value1 = document.getElementById('prompt_value1').value;
	  window[func](prompt_value1);
	  document.getElementById('dialogbox').style.display = "none";
	  document.getElementById('dialogoverlay').style.display = "none";
	}
}

【问题讨论】:

    标签: javascript function quotes


    【解决方案1】:

    func 变量似乎是一个字符串,用于标识附加到全局 window 对象的函数,您在 ok 函数中使用 window[func](prompt_value1); 调用该对象。

    func 需要作为字符串发送,因为 它是窗口对象上的键

    如果您要删除示例中的 qoutes,按钮的 onclick 方法将尝试在当前范围内发送您的 func 变量的值。由于func 在您的函数范围内声明,您将无法访问它。相反,变量值是内联的。

    这个例子内嵌了变量place

    function hello(place) {
      console.log(place);
    }
    function iHaveMyOwnScope() {
      var place = "world"; // this is in my scope
      var container = document.getElementById('container1');
      container.innerHTML = '<button onclick="hello(\''+place+'\')">Hello1</button>';
    }
    iHaveMyOwnScope();
    &lt;div id="container1"&gt;&lt;/div&gt;

    本示例尝试通过全局范围访问变量place

    由于place 未在全局范围内定义,因此无法访问。

    function hello(place) {
      console.log(place);
    }
    function iHaveMyOwnScope() {
      var place = "world"; // this is in my scope
      var container = document.getElementById('container1');
      container.innerHTML = '<button onclick="hello(place)">Hello2</button>';
    }
    iHaveMyOwnScope();
    &lt;div id="container1"&gt;&lt;/div&gt;

    此示例以编程方式创建按钮并将事件处理程序附加到函数范围内

    function hello(place) {
      console.log(place);
    }
    function iHaveMyOwnScope() {
      var place = "world"; // this is in my scope
      var container = document.getElementById('container1');
      
      var button = document.createElement('button')
      button.innerHTML = 'Hello3'
      button.addEventListener('click', function() {
        // Here we can access the place variable
        // since this handler is defined in the functions scope
        hello(place)
      }, false)
      
      // Add button to container
      container.appendChild(button);
    }
    iHaveMyOwnScope();
    &lt;div id="container1"&gt;&lt;/div&gt;

    【讨论】:

    • 如果我说 var func='newToDo' ,console.log(func) -> newToDo。如果我说 Prompt.ok(func);它工作正常。所以既然 html 是 onclick="Prompt.render('Input a new ToDo:','newToDo')" 为什么我必须用引号重新包装 newToDo?
    • @DCR 我更新了我的答案。如果您在帖子示例中删除 qoutes,则 func 变量将在未声明的范围内使用。它是render 函数范围的一部分。
    • 感谢您的回答,但我不明白。是否有参考或教程可以引导我完成此操作?
    • @DCR 我添加了一些可能有助于您理解的示例。
    • 感谢您的帮助。你能指出一个解释范围和内联变量的参考吗?
    猜你喜欢
    • 1970-01-01
    • 2010-09-12
    • 2013-03-22
    • 2022-11-10
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-10
    相关资源
    最近更新 更多