关于一道题目引发的思考

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完全不同,所以自然没有什么联系,双方的赋值不会互相影响。

纯粹个人理解,如果有不对的恳请指点,谢谢!

参考:var与this定义变量的区别以及疑惑

猜你喜欢

转载自blog.csdn.net/qq_35125764/article/details/80576937