此代码在第{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>
答案 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元素