【问题标题】:Why doesn't my homemade isset function in javascript completely work?为什么我在javascript中自制的isset函数不能完全工作?
【发布时间】:2014-10-16 14:20:17
【问题描述】:

在一本书试图说明全局/局部变量范围时,它使用这个例子来传达这个概念:

test();

if (isset(bar)){ 

    alert('bar must be global!');

}else{

    alert('bar must be local!');

}

function test(){

   var foo = 3;
   bar = 5;

}


function isset(varname){

    return typeof varname != 'undefined';

}

现在 if 返回警报“bar 必须是全局的。”,这是有道理的,因为传递给 isset() 的变量 bar,在这种情况下是全局的。但是为什么 if 语句不返回 alert('foo must be local');当你通过让我们说当你通过foo 在 isset 函数中。

【问题讨论】:

  • 因为调用isset() 时没有声明符号“foo”。如果你从 inside “测试”函数调用 isset(foo),它就会被设置。
  • 因为您只使用bar 作为参数调用isset() 一次。
  • 我知道这在理论上是有道理的。但是else 不应该着火吗?
  • 没有。您在问“是否已定义栏”。答案是肯定的,所以else 不会被检查。
  • 但我要说的不是 bar,而是使用 foo。理论上不应该 else 返回,因为它们不是全局变量。

标签: javascript scope


【解决方案1】:

"bar" 没有在你的函数 test() 中的任何地方声明。然后 Javascript 假定它是一个全局变量。

为确保您不会犯此类错误,我建议您使用:

"use strict";

将该行放在文件的开头。它将防止出现这里提出的许多错误:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode

它将防止未声明的变量充当全局变量

【讨论】:

    【解决方案2】:

    由于您没有使用 var 关键字,因此该变量是在全局范围内定义的,并且在执行测试功能后仍然存在。这个解释更彻底here

    【讨论】:

      猜你喜欢
      • 2020-07-30
      • 2011-04-13
      • 1970-01-01
      • 2021-07-31
      • 1970-01-01
      • 2020-05-26
      • 2014-06-01
      • 2022-01-15
      • 1970-01-01
      相关资源
      最近更新 更多