关于this,作用域,属性,原型链的一个小练习

function p () {
    this.name = 'x';
    var name = 'y';
    this.getName = function () {
        return name;
    }
}
// 求值
console.log(new p().getName());

getName方法里面返回name值,此时name值从作用域里面找,即var name = 'y';,返回y;
将getName方法里面的return name;改成return this.name;,这时会从this里面找属性为name的值,即'this.name = 'x';',返回x(之前一直觉得this取决于定义环境,而不取决于执行环境,后来得到一种说法是this取决于调用环境,包括方法调用、函数调用、构造器调用和apply/call调用,其实这边的调用和定义是一个意思,比如上面的this便是构造器调用)。

function p () {
//    this.name = 'x';
//    var name = 'y';
    this.getName = function () {
        return this.name;
    }
}
p.prototype.name = 'z';
// 求值
console.log(new p().getName());

若找不到属性便会在原型链上找name,即p.prototype.name = 'z';,返回z。

发表评论

电子邮件地址不会被公开。 必填项已用*标注