0

在下面的代码中jQuery,为什么下一个参数是undefined

JavaScript:

(function(a,b){
    ....
})(window)

这里a=window可是b=undefined,为什么会这样呢?

4

3 回答 3

7

这是一种常见的技术,可以确保您有一个真正的undefined值来检查,因为undefinedwindow 对象的属性曾经是可写的,因此不能可靠地用于检查。由于只有一个参数被传递给函数,所以第二个参数肯定undefined. 该变量的名称无关紧要,它可以是undefined但也可以foobar,或者在这种情况下,(因为这是保存有价值字节的最短方法)b

现在您可以安全地检查变量的未定义性,因为您确定 b 的值:

// overwriting the global undefined property works in old browsers
undefined = 3;

(function(a,b){

    var asd; // not initialised, thus undefined

    if (asd === undefined){
       // should trigger, but won't because undefined has been overwritten to 3
    }
    if (asd === b){
       // is safe, bcause you know that b is undefined
    }

})(window)

新浏览器(IE9、FF4+、Chrome)遵循 EcmaScript5 规范,undefined不再可写。

于 2013-03-01T08:12:42.500 回答
6

因为您没有为第二个参数传递任何内容。您只通过了一个,即window

你的代码

(function(a,b){
    ....
})(window)

定义一个函数并立即调用它。上面的最后一行实际上是使用window参数调用函数。如果您在那里传递 2 个参数,b则不会未定义。

于 2013-03-01T08:10:46.277 回答
1

这是您尝试使用的即时 javascript 函数语法:

(/* function body */)(/* params */)

命名函数定义如下:

function addNumbers(a, b){
    alert(a + b);
}

你称之为:

addNumbers(1, 2)

或者类似的立即函数(同时定义和执行):

(function(a, b){
    alert(a + b);
})(1, 2)
于 2013-03-01T08:24:02.820 回答