Javascript:性能,发送函数未定义的变量

时间:2013-08-30 01:24:57

标签: javascript function undefined

有没有理由认为其中一种方法比另一方更好或更差?

function func1(x,y,z){
  //do something with x,y,z
}

var x,y;
if (CONDITION){
  var z;
}

// method1
if (z) {
  func1(x,y,z);
}

第一个方法检查z,然后将x,y,z调用到函数

function func2(x,y,z){
  if (z){
    //do something with x,y,z
  }
}    

var x,y;
if (CONDITION){
  var z;
}

// method2
func2(x,y,z);

第二个只用x,y,z调用函数,知道z可能是未定义的,然后检查z

编辑... 在评论中,我能够解析我还在问什么...... ...如果解释器选择以不同的方式处理未定义的属性,我将在未来设置自己...这意味着这是一个漏洞利用,或者能够发送未定义变量函数的功能

3 个答案:

答案 0 :(得分:2)

如果性能是您的主要关注点,正如标题所示,我希望方法1更好。测试z的真实性可能比进行函数调用要便宜,因此在未定义z时避免调用。但如果你想确定,请访问jsperf.com并进行测试。

答案 1 :(得分:0)

在第二个例子中,additonnal函数调用在技术上应该更昂贵,但我猜测差异是微不足道的。

此外,将潜在的undefined值传递给函数也没有错。这一切都取决于您的使用案例。如果将undefined封装在函数本身中是有意义的,那就让它成为。

最后,所有变量声明都将在其作用域的顶部悬挂,即使它们出现在代码中的其他位置。基本上,只要您只声明一个变量,而不是初始化它,如果您将声明放在if语句中就没有区别了。

答案 2 :(得分:0)

  

我更关心javascript如何处理undefineds

考虑以下内容(仅在严格模式中可见,因此 IIFE 模式)

// A
(function () {
    "use strict";
    function foo(bar) {console.log('foobard');}
    foo(z);
}()); // ReferenceError: z is not defined

// B
(function () {
    "use strict";
    var z;
    function foo(bar) {console.log('foobard');}
    foo(z);
}()); // foobard

// C
(function () {
    "use strict";
    if (false) {
        var z;
    }
    function foo(bar) {console.log('foobard');}
    foo(z);
}()); // foobard

你会看到,即使var位于if的代码块内部且从未执行过它的内容,var仍然适用于那里的名字(他们如果它们被设置,将被留下 undefined 。因此,担心 JavaScript 将如何处理 undefined 在当前模式中不是问题,在尝试引用它们之前使用var表示所有名称。
函数的参数名称可以被认为是在函数体的其余部分之前的另一个var行,因此如果参数被命名,即使未定义函数的传递,它们不会导致引用错误。