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。