代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<p id="p0"></p>
</body>
<script>
window.id = 'window';
document.getElementById('p0').onclick = function(){
alert(this.id);
var callback = function(){
alert(this.id)
}
callback();
};
</script>
</html>
第一个输出"p0"可以理解很正常,为何第二个输出的是"window",callback是内部的函数他应该和外部的this都隐式调用指向p0,为何外部指向p0,内部指向window?
于是尝试命令行运行:
window.name = "window"
var text = function(){
name = "text";
alert(this.name);
var callback = function(){
alert(this.name)
}
callback()
}
text()
结果输出两次"text"
两者矛盾了吧,已晕望大神指点
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
所以自始至终你都是在操作同一个
name,即window.name。如果想要理解this,可以改一下代码补充一下
上面都是用的 es5 语法,如果用 es6 的箭头函数,或者说 Lambda 语法,就不需要缓存
_this。我觉得 callback 又不是外部那个function的属性,所以callback里的this不会指向到外面那个function那边去。
至于为什么第二个例子都是text呢???
亲,里面的name忘了var了,没var会被当成全局,不信你再试试window.name看还是不是"window"
你描述的两种情况都可以佐证第一个
this指向DOM,第二个this指向window。this关键是看执行环境, 第一次在DOM中,这个不需要太多解释; 第二次相当于window.callback(), 所以this指向window。你描述的第二种场景出现你理解的差异是因为
name = "text";, 这一步赋值操作, 使得window.name = "text", 所以执行callback()会打出text。关于你验证想法的例子楼上都说出错误了。
补充:
1.如果事件函数中有一个内部函数func,在事件内部调用func时,func函数内部this实际指向window。
2.this的隐式绑定是作为
对象的方法调用时才能生效。3.对于1.我们可以使用call方法来修正
this 指向的是方法属性的所有者,第一个方法的所有者是DOM元素, 内部函数call由于没有申明所有者所以他的所有这是window