织梦网站文章发布模板下载,公司做免费网站建设,舞蹈网页设计素材,河北邢台有什么好玩的地方看函数在执行的时候是如何调用的#xff0c; 1 如果这个函数是用普通函数调用模式来进行调用#xff0c;它内部的this指向了window; 2 如果一个函数在调用的时候是通过对象方法模式来进行调用#xff0c;则它内部的this就是我们的对象; 3 如果一个函数在调用的时候通过构…看函数在执行的时候是如何调用的 1 如果这个函数是用普通函数调用模式来进行调用它内部的this指向了window; 2 如果一个函数在调用的时候是通过对象方法模式来进行调用则它内部的this就是我们的对象; 3 如果一个函数在调用的时候通过构造函数模式调用则它内部的this指向了生成的实例; 4 如果这个函数是通过方法借用模式调用则这个函数内部的this就是我们手动指定this
// 第1题
function Fn() {console.log(this);
}
Fn(); // window 普通函数调用模式
new Fn(); // {} 构造函数调用模式
Fn.apply(Fn); // Fn的函数体 方法借用模式// 第2题
var o {f: function() {console.log(this);},2: function() {console.log(this);console.log(this.__proto__ o[2].prototype);}
};
o.f(); // o 对象调用模式
o[2](); // o 对象调用模式
new o[2](); // {} 通过构造函数模式进行调用
o.f.call([1, 2]); // [1,2] call方法进行方法借用
o[2].call([1, 2, 3, 4]); // [1,2,3,4] call方法进行方法借用// 第3题
var name out;
var obj {name: in,prop: {name: inside,getName: function() {return this.name;}}
};console.log(obj.prop.getName()); // 对象调用模式来进行调用 obj.prop.name打印 inside
var test obj.prop.getName; // 把test这个变量指向了obj.prop.getName所在的内存地址
console.log(test()); // 普通函数模式来进行调用this指向window打印 out
console.log(obj.prop.getName.apply(window)); // 方法借用模式打印 out
console.log(obj.prop.getName.apply(this)); // 方法借用模式打印 out
console.log(this window); // true// 第4题
var length 10;
function fn() {console.log(this.length);
}
var obj {length: 5,method: function(f) {console.log(this);f(); // f在调用的时候是什么调用模式普通函数调用模式 window.length打印 10arguments[0](); // 通过什么模式来进行调用的。执行之前有[]和.就是对象调用模式。// arguments是一个类数组也就是一个对象就是通过arguments来进行调用的// 通过arguments对象进行调用因此函数内部的this是 arguments// arguments.length实参的数量。实参长度是1所以打印 1arguments[0].call(this);// 如果一个函数在调用的时候它前面有call和apply那么就肯定是方法借用模式调用// 调用method方法是通过obj.method 因此在这里的this就是 obj// 通过call方法把fn内的this指向了obj// 输出obj.length打印 5}
};
obj.method(fn);// 第5题
function Foo() {getName function() {console.log(1);};return this;
}
Foo.getName function() {console.log(2);
};
Foo.prototype.getName function() {console.log(3);
};
var getName function() {console.log(4);
};
function getName() {console.log(5);
}
// 请写出以下输出结果
Foo.getName(); // 2
getName(); // 4
Foo().getName(); // 1
getName(); // 1
new Foo.getName(); // 2
new Foo().getName(); // 3
new new Foo().getName(); // 3// 第6题
var obj {fn: function() {console.log(this);}
};
obj.fn(); // obj
var f obj.fn;
f(); // window
console.log(f obj.fn); // true
// f和obj.fn是同一个函数但是他们在调用的时候使用的函数调用模式不同因此它们内部的this指向也就不同。// 第7题
var arr [function() {console.log(this);}
];
arr[0](); // 数组本身
// 数组也是一个复杂数据类型也是一个对象那用数组去调用函数使用的模式就是对象方法调用模式。
function f() {console.log(this);
}
function fn() {console.log(arguments); // 类数组也是就一个对象 [0:function f(){}]console.log(this); // windowarguments[0]();console.log(arguments[0]); // 内部的this就是arguments// 通过arguments对f这个方法进行调用使用的是对象方法调用模式。
}
fn(f);// 第8题
function SuperClass() {this.name women;this.bra [a, b];
}
SuperClass.prototype.sayWhat function() {console.log(hello);
};
function SubClass() {this.subname you sister;SuperClass.call(this);
}
var sub new SubClass();
console.log(sub.sayWhat());