你好,不知道你是想让大家帮你解释代码呢,还是想找人帮你分析最后console出来的结果。索性我就都帮你解答一下吧。
首先,我们来看一下代码解释:
// 声明一个全局变量name,并给name赋值为window字符串
var name = "window";
/**
* 定义一个名为func的函数
* 从后面的使用方式来看,这是一个构造函数
*/
function func() {
// 为构造函数声明一个成员变量name
// 并给成员变量name赋值为func字符串
this.name = "func";
// 为构造函数声明一个成员方法method
this.method = function() {
// 调用【Window对象内置的】setTimeout方法
setTimeout(function() {
// 关键在与此处的this为什么指向的是Window??
console.log(this.name);
}, 0);
};
}
// 创建一个func的实例对象,并调用它的method方法
new func().method();
接着,我们来分析一下运行结果。
第一点,搞清楚一个问题。在浏览器中声明一个全局变量,会默认作为Window对象的属性。所以,当执行完'var name = "window";'之后,便有了'window.name = "window"';可如下验证:
var name = 'new name';
console.log(window.name); // new name
第二点,Javascript程序中,在没有通过call、apply等方法人为控制的情况下,this指向的是被调用的方法所属的对象。如题:method方法被调用的时候,method内部的this指向的应该是被new出来的实例对象,验证方法:
function func() {
this.method = function() {
console.log(this === instanceObj);
}
}
var instanceObj = new func();
instanceObj.method(); // true
第三点,为什么题述代码console出来的是"window",而不是"func"?我们先看setTimeout方法是一个全局方法,即:setTimeout === window.setTimeout。因此setTimeout所属的对象应该是window。再根据第二条的结论,setTimeout内部的this指向的应该是window对象,那么结论就显而易见了:因为window.name = "window",所以最终打印出来的就是"window"了。
希望我讲得够清楚了,如有疑问可追问,望采纳~