var name = 'guy';
function A(){
var name;
this.name='world';
console.log(name);
}
function say(){
if(name === 'undefined'){//断点执行时 name: guy
name='xing';
console.log('goodbye'+this.name);//this.name为world
}else{
console.log('hello '+name);
}
}
A.prototype.say=say;
var a = new A(); //undefined
a.say(); // hello guy
say(); //hello guy
//打开浏览器控制台执行一下命令
//定义了一个全局变量
var wahaha = “娃哈哈”;//这里双引号改成英文双引号
//输出“娃哈哈”
console.log(wahaha);
//输出“娃哈哈”,我们知道这里的this指向的是window,即之前的var定义已经把wahaha变量定义成了window的成员变量
console.log(this.wahaha);
看到的认为合理的解释:
这是一个作用域和上下文的问题。在JavaScript中,this
指向当前的上下文,而var
定义的变量值在当前作用域中有效。JavaScript有两种作用域,全局作用域和局部作用域。局部作用域就是在一个函数里。var
关键字使用来在当前作用于中创建局部变量的,而在浏览器中的JavaScript全局作用域中使用var
语句时,会把申明的变量挂在window
上,而全局作用域中的this
上下文恰好指向的又是window
,因此在全局作用域中var
申明的变量和window
上挂的变量,即this
可访问的变量有间接的联系,但没有直接联系,更不是一样的。
考虑new
一个函数,根据上面的(1)知道,执行构造函数时,上下文this
为新建的对象(该对象的原型链__proto__
指向了该函数的prototype
,这就是原型继承,顺便提一下,与本问题无关),而作用域确实局部的,与this
完全不同,所以自然没有什么联系,双方的赋值不会互相影响。
纯粹个人理解,如果有不对的恳请指点,谢谢!