1

我正在浏览一些 jQuery 教程,但我似乎无法找到这种混乱的原因。

<div id="container">

        <a href="#">Click Me</a>


    </div>      
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.js"></script>
    <script>

        function doSomthing(){
            aMessage = message;
            console.log(this);
            console.log(aMessage);
        }

        $('a').on('click', doSomthing)
    </script>

当用户单击锚标记并运行 doSomthing 函数时,查看上面的代码。

但是我不明白为什么,如果将代码更改为以下内容(将括号添加到 doSomthing),doSomthing 函数会立即运行而无需单击锚标记。

$('a').on('click', doSomthing())

此外,如果我想在单击时运行 doSomthing 时传递参数,会发生什么。例如

<div id="container">

        <a href="#">Click Me</a>


    </div>      
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.js"></script>
    <script>

        function doSomthing(message){
            console.log(this);
            console.log(message);
        }

        $('a').on('click', doSomthing('face bash'))
    </script>

我通常期望的是,在我单击锚标记后,控制台将记录“this”和传递的字符串,但是 doSomthing 函数在页面加载后立即运行,而不是在单击锚标记时运行:S

您如何正常将参数传递给通过其他函数调用的函数:S?

4

2 回答 2

3

也许试试

$('a').on('click', function(){
    doSomthing('face bash');
})

?

于 2012-07-01T12:31:51.910 回答
0

您需要从函数返回一个新函数:

    function doSomthing(message) {
        return function() {
            console.log(this);
            console.log(message);
        };
    }

由于您传递的是调用结果doSomthing.click因此结果必须是函数 not undefined

$('a').on('click', doSomthing('face bash'))

保持原样。

或者,您可以保持doSomthing机智并且只是代理(Currying 仍然没有记录并且需要 jQuery 1.6+)它:

 $('a').on('click', $.proxy(doSomthing, null, "face bash"))
于 2012-07-01T12:37:49.313 回答