3

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

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

编辑...在评论中我能够解析出我还问什么... ...如果解释器选择以不同的方式处理未定义的属性,我是否会让自己在未来度过一段糟糕的时光...意思这是一个漏洞,还是能够向函数发送未定义的变量一个特性

4

3 回答 3

2

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

于 2013-08-30T01:32:17.867 回答
0

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

undefined此外,将潜在值传递给函数也没有错。这完全取决于您的用例。如果将检查封装在函数本身中是有意义undefined的,那就顺其自然吧。

最后,所有变量声明都将被提升到其作用域的顶部,即使它们出现在代码中的其他位置。基本上,只要您只是声明一个变量,而不是对其进行初始化,是否将声明放入if语句中没有区别。

于 2013-08-30T01:37:40.070 回答
0

我更关心的是javascript如何处理未定义的

考虑以下(仅在严格模式下可见,因此为 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的 an 的代码块内,它仍然适用于那里的名称(如果它们被设置,它们将保持未定义)。因此,担心JavaScript将如何处理undefined在您当前的模式中不是问题,它在尝试引用它们之前使用所有名称。函数 的参数名称可以被认为是函数体其余部分之前的另一行,所以如果一个参数被命名,即使函数传递了undefinedifvarvar
var使用比命名参数更少的参数调用,它们不会导致引用错误。

于 2013-08-30T01:43:56.780 回答