一、分析代码执行结果
var length = 10; function fn() { console.log(this.length); } var obj = { length: 5, method: function (fn) { fn(); arguments[0](); fn.call(obj, 12); } }; obj.method(fn, 1); //10 2 5
fn(); //this指向window,默认绑定,window的length值为10
arguments[0](); //this指向arguments,隐式绑定,arguments的length值为2
fn.call(obj, 12); //this指向obj,显示绑定,obj的length值为5
二、修改下面的代码,使结果不是undefined。
function A(){ function initName(){ this.name = 'camille'; // 这里的this指向window } initName(); } var a = new A(); console.log(a.name); //undefined
方法1
function A(){ var _this = this; // 这里的this指向A{} function initName(){ _this.name = 'camille'; // 这里的_this指向A{ name:"camille" } } initName(); } var a = new A(); console.log(a.name); // camille
方法2
function A(){ function initName(){ this.name = 'camille'; } initName.call(this); // 这里的this指向A{ name:"camille" } } var a = new A(); console.log(a.name);// camille
方法3
function A(){ function initName(){ this.name = 'camille'; // 这里的this指向initName{ name:"camille" } } return new initName(); } var a = A(); console.log(a.name);// camille
方法4
function A(){ (function initName(that){ that.name = 'camille'; // 这里的that指向A{ name:"camille" } })(this); } var a = new A(); console.log(a.name);// camille
方法5
function A(){ } A.prototype.initName = function(){ this.name = 'camille'; // 这里的this指向A{ name:"camille" } } var a = new A(); a.initName(); console.log(a.name);// camille
方法6
function A(){ var name; this.initName = function(){ name = 'camille'; // 这里的this指向A{} } this.getName = function(){ return name; }; this.initName();// 这里的this指向A{} } var a = new A(); console.log(a.getName());// camille
方法7
function A(){ var name; this.initName = function(){ name = 'camille'; } this.getName = function(){ return name; }; this.initName(); } function B(){ A.call(this);// 这里的this指向B{} } var b = new B(); console.log(b.getName());// camille
方法8
function A(){ this.name='camille'; } A.prototype.name='houyi'; var a=new A(); console.log(a.name);// camille delete(a.name); console.log(a.name);// houyi
方法9
function A(){ this.name='camille'; } A.prototype.name='houyi'; var a=new A(); a.name='gamiye'; console.log(a.name);// gamiye delete(a.name); console.log(a.name);// houyi
js寻找对象的方式:先在自身找,找不到才会去原型链上找。