需要帮助理解代码中为什么这一行

时间:2011-06-01 14:26:14

标签: javascript jquery

此代码在第{99}页<{3}}

为什么他写这行

var current = this;

    <!DOCTYPE html>
<html id="greatgreatgrandpa">
    <head>
        <title>DOM Level 0 Bubbling Example</title>
        <link rel="stylesheet" type="text/css" href="../styles/core.css"/>
        <script type="text/javascript" src="../scripts/jquery-1.4.js"></script>
        <script type="text/javascript" src="../scripts/jqia2.support.js"></script>
        <script type="text/javascript">
            $( function() {
                $('*').each( function() {
                    var current = this;
                    this.onclick = function(event) {
                        if (!event)
                            event = window.event;
                        var target = (event.target) ?
                        event.target : event.srcElement;
                        say('For ' + current.tagName + '#'+ current.id +
                        ' target is ' +
                        target.tagName + '#' + target.id);
                    };
                });
            });
        </script>
    </head>
    <body id="greatgrandpa">
        <div id="grandpa">
            <div id="pops">
                <img id="example" src="example.jpg" alt="ooooh! ahhhh!"/>
            </div>
        </div>
    </body>
</html>

5 个答案:

答案 0 :(得分:7)

他这样做是为了保存this值并在嵌套的词法范围内使用。每个函数调用任何函数都涉及(内部)设置this以根据调用的细节引用某个对象。因此,在嵌套函数(在另一个函数内声明的函数,如本例中)中,如果需要引用this的“外部”值,那么就会出现问题:{{1}在那个嵌套的上下文中,将被设置为引用其他东西(不一定,但可能)。通过在外部上下文中“捕获”this,内部代码将能够自由地引用它。

顺便说一句,这是一本非常好的书;我曾与其中一位作者(熊)合作: - )

答案 1 :(得分:2)

所有其他答案都是正确的;我只是想让它更容易理解。

this由上下文指定。如果函数作为事件处理的一部分被调用,则this被分配给触发事件的DOM元素。在上面的示例中,这将是被单击的元素。

以类似的方式,循环this中的$('*').each()是DOM中的当前元素(与选择器'*'匹配的元素)。

这意味着在调用函数之前,浏览器会更改this。如果要在内部单击处理程序中使用外部this,则必须创建对它的引用。引用保持其值,因为浏览器在创建内部单击处理程序时将对所有可见变量进行复制

这也意味着current将成为所有内部点击处理程序的不同参考。对于每个处理程序,它将指向创建单击处理程序时外部this具有的值。

答案 2 :(得分:1)

因为在为onclick定义的函数中,this引用了事件触发的对象,所以要引用该代码块之外的this,必须将其分配给其他内容第一

答案 3 :(得分:1)

查看为onclick定义的函数。 this的含义在该函数内部是不同的,因为它是在函数运行时设置的。

通过执行var current = this,它存储了this的当前值的副本,因此可以在嵌套函数声明中使用它。

答案 4 :(得分:1)

这行代码的目的是能够在this函数中使用this.onclick = function(event) { }的值,因为在此函数中this将引用被点击的DOM元素