显示模块模式:func.apply(null,arr)与func.apply(this,arr),其中func在匿名函数内

时间:2013-09-22 15:59:14

标签: javascript

请您解释一下在下面的代码示例中使用func.apply(null, arr)func.apply(this, arr)之间的区别吗?

var Foo = function() {
    function useMe(a, b, c)
    {
        document.body.innerHTML =
            '<p>a: ' + a + '<br>b: ' + b + '<br>c: ' + c + '</p>'
    }

    function go()
    {
        var arr = ['foo', 'bar', 'baz']
        useMe.apply(null, arr)
    }

    return {
        go: go,
        useMe: useMe
    }
}()

Foo.go()

来源:http://jsfiddle.net/YQsaJ/

var Foo = function() {
    function useMe(a, b, c)
    {
        document.body.innerHTML =
            '<p>a: ' + a + '<br>b: ' + b + '<br>c: ' + c + '</p>'
    }

    function go()
    {
        var arr = ['foo', 'bar', 'baz']
        useMe.apply(this, arr) // USING this INSTEAD OF null
    }

    return {
        go: go,
        useMe: useMe
    }
}()

Foo.go()

JSFiddle:http://jsfiddle.net/3DvtA/

我理解当null用作apply函数的第一个参数时,全局对象即window用作this的{​​{1}}参数}}。对于像上面代码一样简单的用法,作为useMe函数的第一个参数传递的内容真的很重要吗?

2 个答案:

答案 0 :(得分:2)

所有功能都有一个所谓的上下文。此上下文是一个对象,位于this变量中。

警告“Hello World”的示例:

function hello() {
  alert(this.greeting);
}

hello.apply({greeting: "Hello World"});

您的功能无法访问this,因此无论您指定 null 还是,在您的上下文中都无关紧要。

从ES 5严格模式开始,window不再是函数的标准上下文,而是包含值undefined

答案 1 :(得分:2)

apply的第一个参数是在函数调用中用作this的值。由于useMe不使用this,因此您提供的内容无关紧要。提供nullundefined告诉apply使用全局对象(在松散模式下)或undefined(在严格模式下)。